diff --git "a/12\354\233\224 7\354\235\274/23059.cpp" "b/12\354\233\224 7\354\235\274/23059.cpp" new file mode 100644 index 0000000..178b8fe --- /dev/null +++ "b/12\354\233\224 7\354\235\274/23059.cpp" @@ -0,0 +1,80 @@ +#include +#include +#include +#include +#include + +using namespace std; + +unordered_map indegree; +unordered_map> graph; + +//À§»óÁ¤·Ä +vector topologicalSort(set& item) { + vector result; //result¹è¿­ + priority_queue, greater<>> pq, pq_temp; //¿ì¼±¼øÀ§ Å¥ + + for (auto iter = item.begin(); iter != item.end(); iter++) { //¾ÆÀÌÅÛ È®ÀÎÇϸ鼭 + if (indegree.find(*iter) == indegree.end()) //ÁøÀÔÂ÷¼ö°¡ Á¸ÀçÇÏÁö ¾Ê´Â´Ù¸é(0 À̶ó¸é) + pq.push(*iter); //Å¥¿¡ ³Ö´Â´Ù. + } + while (!pq.empty()) { //ºñ¾îÀÖÁö¾Ê´Ù¸é + string node = pq.top(); //node¿¡ top(À§¿¡ÀÖ´Â °ªÀ» ³Ö°í) + pq.pop(); //Å¥¿¡¼­ Á¦°ÅÇÑ´Ù + + result.push_back(node); //ÇöÀç Á¤Á¡ ¼ø¼­¿¡ »ðÀÔ + for (int i = 0; i < graph[node].size(); i++) { //±× Á¤Á¡¿¡¼­ ¿¬°áµÈ ³ëµåÀüºÎÈ®ÀÎ + string next_node = graph[node][i]; //´ÙÀ½ ³ëµå ¹æ¹® + indegree[next_node]--; //¿¬°áµÈ Á¤Á¡ÀÇ ÁøÀÔÂ÷¼ö¸¦ 1¾¿ °¨¼Ò + if (indegree[next_node] == 0) //¿¬°áµÈ Á¤Á¡ÀÇ ÁøÀÔÂ÷¼ö°¡ 0ÀÌ µÇ¾ú´Ù¸é + pq_temp.push(next_node); //¿ì¼± pq_temp¿¡ »ðÀÔ + } + if (pq.empty() && !pq_temp.empty()) //ÀÌÀü¿¡ ÁøÀÔÂ÷¼ö°¡ 0ÀÌ¿´´ø Á¤Á¡À» ¸ðµÎ Ž»öÇß°í, »õ·Î Ž»öÇÒ Á¤Á¡ÀÌ ÀÖ´Ù¸é + swap(pq, pq_temp); //swap + } + return result; //result¹è¿­ ¹Ýȯ +} + +/** + * ¹®ÀÚ¿­À» À妽º·Î »ç¿ëÇØ¾ß Çϱ⶧¹®¿¡ mapÀ» »ç¿ë + * + * !ÁÖÀÇ! ÀÏ¹Ý mapÀ» »ç¿ëÇÏ¸é ½Ã°£ÃÊ°ú. µû¶ó¼­ mapº¸´Ù °Ë»ö ¼Óµµ°¡ ºü¸¥ unordered_map »ç¿ëÇØ¾ß ÇÔ + * -> mapÀº ÀÌÁø Ž»ö Æ®¸® ÇüÅ·Πkey°ªÀ» Á¤·ÄÇؼ­ ½Ã°£ º¹Àâµµ°¡ logN ÀÌÁö¸¸, unordered_mapÀº hashÇüÅ·ΠÀúÀåÇؼ­ ½Ã°£ º¹Àâµµ°¡ 1ÀÌ´Ù + * !ÁÖÀÇ! À§»ó Á¤·ÄÀ» ÇÒ ¶§ ¿ø·¡´Â ¿©·¯ °á°ú°¡ °¡´ÉÇÏÁö¸¸ ÇØ´ç ¹®Á¦´Â ¼ø¼­¹èÄ¡°¡ Áß¿ä (¼ø¼­´Â ¿¹Á¦ 3 Âü°í) + * 1. ÁøÀÔÂ÷¼ö°¡ 0ÀÎ Á¤Á¡µé³¢¸® Á¤·ÄÇؼ­ »ç¿ëÇØ¾ß ÇÔ + * 2. ÁøÀÔÂ÷¼ö°¡ 0ÀÎ Á¤Á¡ÀÌ µ¿½Ã¿¡ ¿©·¯ °³ÀÏ °æ¿ì ÇØ´ç Á¤Á¡µéÀ» ¸ÕÀú ¼ø¼­¿¡ ¹èÄ¡ÇØ¾ß ÇÔ. + * -> µû¶ó¼­ ¿ì¼±¼øÀ§ Å¥¸¦ »ç¿ëÇÏ¿© ÁøÀÔÂ÷¼ö°¡ 0ÀÎ Á¤Á¡µéÀ» °ü¸®. À̶§ µ¿½Ã¿¡ ÁøÀÔÂ÷¼ö°¡ 0ÀÌ µÈ Á¤Á¡µéÀ» ¸ÕÀú ¹èÄ¡ÇØ¾ß ÇϹǷΠ¿ì¼±¼øÀ§ Å¥¸¦ 2°³ »ç¿ë. + */ + +int main() { + ios_base::sync_with_stdio(false); + cin.tie(NULL); + cout.tie(NULL); + + set item; //Á¸ÀçÇÏ´Â ¾ÆÀÌÅÛ(Á¤Á¡) + int n; + string a, b; + + //ÀÔ·Â + cin >> n; + while (n--) { //ÀԷ¼ö¸¸Å­ ³ëµå ÀÔ·Â + cin >> a >> b; //a < b + indegree[b]++; //ÁøÀÔÂ÷¼ö Áõ°¡ + graph[a].push_back(b); //´Ü¹æÇâ ±×·¡ÇÁ + item.insert(a); //¾ÆÀÌÅÛ »ðÀÔ + item.insert(b); //¾ÆÀÌÅÛ »ðÀÔ + } + + //¿¬»ê + vector result = topologicalSort(item); + + //Ãâ·Â + if (result.size() != item.size()) { + cout << "-1\n"; //-1Ãâ·Â + return 0; //³¡ + } + for (int i = 0; i < result.size(); i++) //¹è¿­ Å©±â¸¸Å­ µ¹¸é¼­ + cout << result[i] << '\n'; //¹è¿­ Ãâ·Â + + return 0; //³¡ +} \ No newline at end of file diff --git "a/12\354\233\224 7\354\235\274/2623.cpp" "b/12\354\233\224 7\354\235\274/2623.cpp" new file mode 100644 index 0000000..dfa8970 --- /dev/null +++ "b/12\354\233\224 7\354\235\274/2623.cpp" @@ -0,0 +1,66 @@ +#include +#include +#include + +using namespace std; + +//À§»óÁ¤·Ä +vector topologicalSort(int n, vector& indegree, vector>& graph) { + vector result; //¹è¿­Çü¼º + queue q; //Å¥ Çü¼º + + for (int i = 1; i <= n; i++) { //¹Ýº¹¹® µ¹¸é¼­ + if (!indegree[i]) //ÁøÀÔÂ÷¼ö°¡ 0À̶ó¸é + q.push(i); //Å¥¿¡ ³Ö±â + } + + while (!q.empty()) { //ºñ¾îÀÖÁö¾ÊÀ¸¸é + int node = q.front(); //°¡Àå ¸ÕÀú ³ÖÀº °ªÀ» ²¨³½µÚ + q.pop(); //popÇÏ¿© Á¦°Å + + result.push_back(node); //ÇöÀç Á¤Á¡ ¼ø¼­¿¡ »ðÀÔ + for (int i = 0; i < graph[node].size(); i++) { //±×·¡ÇÁ¸¦ ´Ù µ¹¸é¼­ + int next_node = graph[node][i]; //´ÙÀ½ ³ëµå¸¦ ã°í + indegree[next_node]--; //¿¬°áµÈ Á¤Á¡ÀÇ ÁøÀÔÂ÷¼ö¸¦ 1¾¿ °¨¼Ò + if (!indegree[next_node]) //¿¬°áµÈ Á¤Á¡ÀÇ ÁøÀÔÂ÷¼ö°¡ 0ÀÌ µÇ¾ú´Ù¸é + q.push(next_node); //next_node¸¦ Å¥¿¡ ³Ö´Â´Ù. + } + } + return result;//Á¤Á¡¼ø¼­´ë·Î »ðÀÔµÈ ¹è¿­ ¹Ýȯ +} + +/** + * ±âº»ÀûÀÎ À§»ó Á¤·Ä ¹®Á¦ + * ÇöÀç °¡¼ö¿Í ¹Ù·Î Àü °¡¼ö »çÀÌÀÇ ¼±ÈÄ°ü°è¸¦ Á¤ÀÇ + * ¼ø¼­¸¦ Á¤ÇÏ´Â °ÍÀÌ ºÒ°¡´ÉÇÑ °æ¿ì(À§»óÁ¤·ÄÀ» ÇÒ ¼ö ¾ø´Â °æ¿ì)´Â ¸ðµç Á¤Á¡À» Ž»öÇÏÁö ¸øÇÑ °æ¿ì + */ + +int main() { + int n, m, cnt, prev, cur; //ÃʱâÈ­ + + //ÀÔ·Â + cin >> n >> m; //ÀÔ·Â + vector indegree(n + 1, 0); //¹è¿­ ÃʱâÈ­ + vector> graph(n + 1, vector(0)); //±×·¡ÇÁ ÃʱâÈ­ + while (m--) { //m°³¼ö ¸¸Å­ + cin >> cnt; //´ã´ç °¡¼öÀÇ ¼ö + cin >> prev; //óÀ½ °¡¼ö ÀÔ·Â + while (--cnt) { //¼±ÈÄ°ü°è Á¤ÀÇ + cin >> cur; //ÀÔ·Â + indegree[cur]++; //ÁøÀÔÂ÷¼ö Áõ°¡ + graph[prev].push_back(cur);//±×·¡ÇÁ¿¡ ³Ö±â + prev = cur; //°»½Å + } + } + + //¿¬»ê + vector result = topologicalSort(n, indegree, graph); //À§»óÁ¤·ÄÇÑ°ªÀ» result·Î ¹Ýȯ¹Þ±â + + //Ãâ·Â + if (result.size() != n) { //¼ø¼­¸¦ Á¤ÇÏ´Â °ÍÀÌ ºÒ°¡ÇÑ °æ¿ì + cout << "0\n"; //0À» Ãâ·ÂÇÏ°í + return 0; //³¡ + } + for (int i = 0; i < result.size(); i++) //¹è¿­°ªÀ» Ãâ·ÂÇؼ­ + cout << result[i] << '\n'; //Á¤·ÄµÈ °ªÀ» º¸¿©ÁØ´Ù. +} \ No newline at end of file diff --git "a/12\354\233\224 7\354\235\274/2637.cpp" "b/12\354\233\224 7\354\235\274/2637.cpp" new file mode 100644 index 0000000..4d36051 --- /dev/null +++ "b/12\354\233\224 7\354\235\274/2637.cpp" @@ -0,0 +1,64 @@ +#include +#include +#include + +using namespace std; +typedef pair ci; + +//À§»óÁ¤·Ä + DP +vector> topologicalSort(int n, vector& indegree, vector>& graph) { + queue q; //Å¥ ¹è¿­ + vector> dp(n + 1, vector(n + 1, 0)); //°¢ ºÎÇ°ÀÌ ¸î °³ ÇÊ¿äÇÑÁö ÀúÀå + + for (int i = 1; i <= n; i++) { //¹Ýº¹Çϸ鼭 ÁøÀÔÂ÷¼ö È®ÀÎ + if (!indegree[i]) { //ÁøÀÔÂ÷¼ö°¡ 0À̶ó¸é -> ±âº» ºÎÇ° + q.push(i); //Å¥ ³Ö±â + dp[i][i] = 1; //±âº» ºÎÇ° ÃʱâÈ­ + } + } + while (!q.empty()) { //Å¥ ºñ¾îÀÖÁö¾Ê´Ù¸é + int node = q.front(); //°¡Àå ¸ÕÀú ³ÖÀº °ªÀ» ²¨³½µÚ + q.pop(); //Å¥¿¡¼­ Á¦°ÅÇÑ´Ù + + for (int i = 0; i < graph[node].size(); i++) { //±×·¡ÇÁ ´Ù µ¹¸é¼­ + int next_node = graph[node][i].first; //´ÙÀ½ ³ëµå¸¦ ã¾Æ¼­ È®ÀÎÇÑ´Ù + int cnt = graph[node][i].second; //ÇÊ¿äÇÑ ºÎÇ° ¼ö + indegree[next_node]--; //¿¬°áµÈ Á¤Á¡ÀÇ ÁøÀÔÂ÷¼ö¸¦ 1¾¿ °¨¼Ò + if (!indegree[next_node]) //¿¬°áµÈ Á¤Á¡ÀÇ ÁøÀÔÂ÷¼ö°¡ 0ÀÌ µÇ¾ú´Ù¸é + q.push(next_node); //Å¥¿¡¼­ Á¦°Å + + for (int j = 1; j <= n; j++) //¹Ýº¹¹® µ¹¸é¼­ + dp[next_node][j] += dp[node][j] * cnt; //(ÇöÀç Á¤Á¡À» ÀÌ·ç´Â ºÎÇ° °³¼ö * ÇÊ¿äÇÑ ÇöÀç Á¤Á¡ÀÇ °³¼ö)¸¦ ´õÇÔ + } + } + return dp; //dp¹Ýȯ +} + +/** + * °¢ ºÎÇ°¸¶´Ù Á¾·ùº° ÇÊ¿äÇÑ ºÎÇ° °³¼ö¸¦ ÀúÀåÇϱâ À§ÇØ 2Â÷¿ø ¹è¿­ »ç¿ë (Çà: ºÎÇ°, ¿­: ÇàÀ» ÀÌ·ç´Âµ¥ °¢ ºÎÇ°º° ÇÊ¿äÇÑ °³¼ö) + * À§»ó Á¤·Ä ¼ø¼­¿¡ µû¶ó, À̾îÁø ´ÙÀ½ Á¤Á¡ÀÇ ºÎÇ°º° °³¼ö¸¦ (ÇöÀç Á¤Á¡À» ÀÌ·ç´Â ºÎÇ°º° °³¼ö * ÇÊ¿äÇÑ ÇöÀç Á¤Á¡ ¼ö)¸¦ ´õÇØÁÖ¸ç ±¸ÇÔ + */ + +int main() { + int n, m, x, y, k; //ÃʱâÈ­ + + //ÀÔ·Â + cin >> n >> m; + vector> graph(n + 1, vector(0)); //±×·¡ÇÁ ÃʱâÈ­ + vector indegree(n + 1, 0); //ÁøÀÔÂ÷¼ö ÃʱâÈ­ + while (m--) { //m°³¸¸Å­ ÀÔ·Â + cin >> x >> y >> k; //y -> x + indegree[x]++; //ÁøÀÔÂ÷¼ö Áõ°¡ + graph[y].push_back({ x, k }); //±×·¡ÇÁ¿¡ ³Ö±â + } + + //¿¬»ê + vector> result = topologicalSort(n, indegree, graph); + + //Ãâ·Â + for (int i = 1; i <= n; i++) { + if (result[i][i]) //±âº» ºÎÇ°À̶ó¸é + cout << i << ' ' << result[n][i] << '\n'; //Ãâ·Â + } + return 0; //³¡ +} \ No newline at end of file diff --git "a/12\354\233\224 7\354\235\274/3085.cpp" "b/12\354\233\224 7\354\235\274/3085.cpp" new file mode 100644 index 0000000..2e278b7 --- /dev/null +++ "b/12\354\233\224 7\354\235\274/3085.cpp" @@ -0,0 +1,76 @@ +#include +#include +#include + +using namespace std; + +vector> board; +int dr[2] = { 1, 0 }; +int dc[2] = { 0, 1 }; + +int cntCandy(int n, int row, int col, int dir) { + int ans = 0, cnt = 0; //ÃʱâÈ­ + char cur = ' '; //ÃʱâÈ­ + for (int i = 0; i < n; i++) { //ÀÔ·ÂµÈ °ª¸¸Å­ ¹Ýº¹¹®À» µ¹¸é¼­ + if (cur == board[row][col]) { //¿¬¼ÓµÈ »çÅÁ + cnt++; //cnt¸¦ Áõ°¡½ÃÅ°°í + ans = max(ans, cnt); //ÃÖ´ë°ªÀ» ans¿¡ ³Ö´Â´Ù + } + else { //ºÒ¿¬¼Ó + cnt = 1; //cntȽ¤µ¸¦ ÃʱâÈ­ ½ÃÅ°°í + cur = board[row][col]; //ÇöÀç°ªÀ» cur¿¡ ³Ö´Â´Ù. + } + row += dr[dir]; //¹æÇ⠹ٲٱâ + col += dc[dir]; //¿­ ¹æÇ⠹ٲٱâ + } + return ans; //ans°ª¹Ýȯ(ĵµð °³¼ö) +} + +int findCandy(int n) { + int ans = 0; //ÃʱâÈ­ + for (int i = 0; i < n; i++) { //¹Ýº¹¹®À» µ¹¸é¼­ + ans = max(ans, cntCandy(n, 0, i, 0)); //°°Àº ¿­¿¡ ´ëÇØ + ans = max(ans, cntCandy(n, i, 0, 1)); //°°Àº Çà¿¡ ´ëÇØ + } + return ans; //cntCandy¸¦ ÅëÇØ ¾òÀº max°ªÀ» ã´Â´Ù +} + +int switchCandy(int n, int row, int col, char candy) { + int ans = 0; //ÃʱâÈ­ + for (int i = 0; i < 2; i++) { //¿À¸¥ÂÊ, ¾Æ·¡¿¡ ÀÖ´Â »çÅÁ°ú ¹Ù²ãº¸±â + int nr = row + dr[i], nc = col + dc[i]; //Çà,¿­ ¹æÇ⠹ٲٱâ + if (nr < n && nc < n && candy != board[nr][nc]) { //¹üÀ§³»¿¡ÀÖ°í board¿¡ ¾ø´Â °ªÀ̸é + swap(board[row][col], board[nr][nc]); //»õ·Î¿î °Í°ú ±âÁ¸°ÍÀ» ¹Ù²Ù°í + ans = max(ans, findCandy(n)); //ans°ªµµ °»½ÅÇÑµÚ + swap(board[row][col], board[nr][nc]); //´Ù½Ã ±âÁ¸°Í°ú »õ·Î¿î°ÍÀ» swapÇÑ´Ù + } + } + return ans; //±×ÈÄ °»½ÅµÈ ans°ªÀ» ¹ÝȯÇÑ´Ù. +} + +/** + * ÀÔ·Â ¹üÀ§°¡ Å©Áö ¾ÊÀ¸¹Ç·Î ¹Ù²Ü ¼ö ÀÖ´Â »çÅÁÀ» ¸ðµÎ ¹Ù²ãº¸¸ç ¸ÔÀ» ¼ö ÀÖ´Â »çÅÁ °è»ê + * ¿À¸¥ÂÊ, ¾Æ·¡¿¡ ÀÖ´Â »çÅÁ°ú¸¸ ¹Ù²ãµµ ¸ðµç °æ¿ì °í·Á °¡´É(¿ÞÂÊ, À§ °í·Á X) + * + * 1. »çÅÁÀÇ »öÀÌ ´Ù¸¥ »çÅÁ¸¸ ±³È¯Çϱâ + * 2. °¢ ¿­, ÇàÀÌ ¸ðµÎ °°Àº »çÅÁÀÏ ¶§ »çÅÁÀÇ °³¼ö°¡ °»½ÅµÇÁö ¾Êµµ·Ï ÁÖÀÇ (ans °»½ÅÀ» line 18~21¿¡¼­ ÇÏ´Â °æ¿ì) + */ +int main() { + int n, max_candy = 0; //ÃʱâÈ­ + + //ÀÔ·Â + cin >> n; + board.assign(n, vector(n, ' '));//board¸¦ ÀÔ·ÂÇϱâÀ§ÇØ ÃʱâÈ­ ½ÃŲ´Ù. + for (int i = 0; i < n; i++) //¹Ýº¹¹®µ¹¸é¼­ + for (int j = 0; j < n; j++) //board¸¦ + cin >> board[i][j]; //ÀÔ·ÂÇÑ´Ù. + + //¿¬»ê + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) //¹Ýº¹¹® µ¹¸é¼­ + max_candy = max(max_candy, switchCandy(n, i, j, board[i][j])); //max°ªÀ» ã´Â´Ù + } + + //Ãâ·Â + cout << max_candy; +} \ No newline at end of file diff --git "a/12\354\233\224 7\354\235\274/\354\271\264\353\223\234\354\247\235\353\247\236\354\266\224\352\270\260.cpp" "b/12\354\233\224 7\354\235\274/\354\271\264\353\223\234\354\247\235\353\247\236\354\266\224\352\270\260.cpp" new file mode 100644 index 0000000..ed9e1be --- /dev/null +++ "b/12\354\233\224 7\354\235\274/\354\271\264\353\223\234\354\247\235\353\247\236\354\266\224\352\270\260.cpp" @@ -0,0 +1,138 @@ +#include +#include +#include +#include + +using namespace std; +typedef pair ci; +const int SIZE = 4; + +int dr[4] = { -1, 1, 0, 0 }; +int dc[4] = { 0, 0, -1, 1 }; + +vector> findCard(vector>& board) { //Á¸ÀçÇÏ´Â ¸ðµç Ä«µåÀÇ À§Ä¡¸¦ ¸®ÅÏÇÏ´Â ÇÔ¼ö + vector> card_pos(7, vector(0)); //ÃÖ´ë Ä«µå ¼ö + int cnt = 0; //cnt ÃʱâÈ­ + for (int i = 0; i < SIZE; i++) { //board¸¦ Á¶È¸È­±âÀ§ÇØ + for (int j = 0; j < SIZE; j++) { //ÀÌÁ߹迭»ç¿ë + cnt = max(cnt, board[i][j]); //board°¡ ±âÁ¸ cntº¸´Ù Å©¸é °»½Å + if (board[i][j]) //Ä«µå¶ó¸é À§Ä¡ ÀúÀå + card_pos[board[i][j]].emplace_back(i, j); //À§Ä¡ÀúÀå + } + } + card_pos.resize(cnt + 1); //½ÇÁ¦ Á¸ÀçÇÏ´Â Ä«µåÀÇ ¼ö¸¸Å­ Å©±â Á¶Àý + return card_pos; //À§Ä¡ ¹Ýȯ +} + +pair ctrl(int row, int col, int dir, vector>& tmp) { //ÄÁÆ®·Ñ·Î À̵¿ÇÏ´Â ÁÂÇ¥¸¦ ¸®ÅÏÇÏ´Â ÇÔ¼ö + while (true) { //¹«ÇÑ ¹Ýº¹ + row += dr[dir]; //À§Ä¡ °»½Å + col += dc[dir]; //À§Ä¡ °»½Å + if (row < 0 || row >= SIZE || col < 0 || col >= SIZE) //ÇØ´ç ¹æÇâ¿¡ Ä«µå°¡ Çϳªµµ ¾ø´Ù¸é ±× ¹æÇâÀÇ °¡Àå ¸¶Áö¸· Ä­À¸·Î À̵¿ + return make_pair(row - dr[dir], col - dc[dir]); //pair¸¦ ¹Ýȯ + if (tmp[row][col] != 0) //´©¸¥ Å° ¹æÇâ¿¡ ÀÖ´Â °¡Àå °¡±î¿î Ä«µå + return make_pair(row, col); //pair¸¦ ¹Ýȯ + } +} + +int bfs(int r1, int c1, int r2, int c2, vector>& tmp) { //ÇöÀç Ä¿¼­¿¡¼­ ¸ñÇ¥ Ä«µå·Î À̵¿ÇÏ´Â °¡Àå ÀûÀº ºñ¿ëÀ» ¸®ÅÏÇÏ´Â ÇÔ¼ö + vector> visited(SIZE, vector(SIZE, 0)); //¹æ¹® À¯¹« È®ÀÎ + queue> q; //Å¥ + visited[r1][c1] = 1; //¹Ýµå½Ã ¿£Å͸¦ ´©¸£°Ô µÉ °Í. ¿£Å͸¦ ¹Ì¸® ´­·¶´Ù °¡Á¤ÇÏ°í 1·Î Ç¥½Ã + q.push({ r1, c1 }); //ÃʱⰪ ³Ö¾îÁÖ±â + + while (!q.empty()) { //ºñ¾îÀÖÁö ¾ÊÀ»µ¿¾È + int row = q.front().first; //Çà °»½Å + int col = q.front().second; //¿­ °»½Å + int dist = visited[row][col]; //dist°»½Å + q.pop(); //Å¥¿¡ ÀÖ´Â °ª »©±â + + if (row == r2 && col == c2) //¸ñÇ¥ Ä«µå¿¡ µµ´ÞÇß´Ù¸é + return dist; //dist°ª ¹Ýȯ + + for (int i = 0; i < 4; i++) { //ÄÁÆ®·Ñ ÀÔ·Â À̵¿ + pair np = ctrl(row, col, i, tmp); //ÄÁÆ®·Ñ °ª np¿¡ ³Ö¾î Á¶È¸ + if (visited[np.first][np.second]) //¹æ¹®ÇÑ °ªÀÌ¸é ³Ñ¾î°¡±â + continue; + visited[np.first][np.second] = dist + 1; //¾Æ´Ï¶ó¸é °»½ÅÇØÁÖ±â + q.push(np); //np°ª Å¥¿¡¼­ Á¦°Å + } + + for (int i = 0; i < 4; i++) { //¹æÇâÅ° ÀÔ·Â À̵¿ + int nr = row + dr[i], nc = col + dc[i]; //»õ·Î¿î Çà,¿­ ¼±¾ð + if (nr < 0 || nr >= 4 || nc < 0 || nc >= 4 || visited[nr][nc]) //¹üÀ§¿Í¿¡ ±×¸®°í ¹æ¹®Çß´ÂÁö È®ÀÎ + continue;//±×·³ ±×³É ³Ñ¾î°¡±â + visited[nr][nc] = dist + 1; //¾Æ´Ï¶ó¸é »õ·Î °»½Å + q.push({ nr, nc }); //»õ·Î¿î °ª ³Ö¾îÁÖ±â + } + } + return -1; //¸ñÇ¥ Ä«µå¿¡ µµ´ÞÇÏÁö ¸øÇÔ (½ÇÁ¦·Î´Â ÀϾÁö ¾Ê´Â ÀÏ) +} + +int matchCard(int bit, int num, int r, int c, vector& seq, vector>& cards, vector> tmp) { //Á¶ÇÕ¿¡ ´ëÇØ Ä«µå¸¦ ¸ÅĪÇÏ´Â ÇÔ¼ö + int ans = 0; //ans°ªÃʱâÈ­ + for (int i = 0; i < num; i++) {//¹Ýº¹¹® µ¹¸é¼­ ij¸¯ÅÍ ÀüºÎ Á¶È¸ + int cur = seq[i]; //À̹ø¿¡ ¸ÅĪÇÒ Ä³¸¯ÅÍ + int now = 0; //ÇØ´ç ij¸¯ÅÍÀÇ 0¹ø° Ä«µåºÎÅÍ ¼±ÅÃÇÑ´Ù°í °¡Á¤ + if (bit & (1 << i)) //¸¸¾à ÇØ´ç À§Ä¡ÀÇ ºñÆ®°¡ 1À» Ç¥½ÃÇß´Ù¸é 1¹ø° Ä«µåºÎÅÍ ¼±Åà + now = 1; //¸ÅĪ Ä«µå À妽º 1·Î + + for (int j = 0; j < 2; j++) {//¹Ýº¹¹® µ¹¸é¼­»õ·Î °»½ÅµÉºÎºÐ °Ë»ç + now = (now + j) % 2; //À̹ø¿¡ ¸ÅĪÇÒ Ä«µå À妽º + int nr = cards[cur][now].first, nc = cards[cur][now].second; //À̹ø¿¡ ¸ÅĪÇÒ Ä«µå À§Ä¡ + ans += bfs(r, c, nr, nc, tmp); //ÇöÀç Ä¿¼­¿¡¼­ ¸ñÇ¥ Ä«µå±îÁö À̵¿ÇÏ´Â ºñ¿ë + + //Ä«µå »èÁ¦ + Ä¿¼­ À̵¿ + tmp[nr][nc] = 0; //Ä«µå »èÁ¦ + r = nr; //±âÁ¸°Å ´ëü + c = nc; //±âÁ¸¿­ ´ëü + } + } + return ans; //ans¹Ýȯ +} + +int solution(vector> board, int r, int c) { + int answer = 1e9; //°¡Àå Å«°ªÀ¸·Î ÃʱâÈ­ ÇصдÙ. + + vector> cards = findCard(board); //Á¸ÀçÇÏ´Â ¸ðµç Ä«µåÀÇ À§Ä¡ + int card_cnt = cards.size() - 1; //Ä«µåÀÇ °³¼ö + + vector seq(card_cnt); //¼ø¿­À» À§ÇÑ ¹è¿­ + for (int i = 0; i < card_cnt; i++) //¼ø¿­À» À§ÇÑ ¹Ýº¹¹® + seq[i] = i + 1; //°»½Å + + do { //°¡´ÉÇÑ ¸ðµç Ä«µå ¼ø¼­¿¡ ´ëÇØ + for (int bit = 0; bit < (1 << card_cnt); bit++) { //0, 1¹ø° Ä«µå Áß ¾î¶² Ä«µå¸¦ ¸ÕÀú µÚÁýÀ»Áö °áÁ¤ + answer = min(answer, matchCard(bit, card_cnt, r, c, seq, cards, board)); //ÃÖ¼Ò°ªÀ» ã´Â´Ù + } + } while (next_permutation(seq.begin(), seq.end()));//next_permutationÀÇ °ªÀÌ falseÀÏ°æ¿ì stop + return answer; //ÃÖ¼ÒÀÇ answer¸¦ ¹Ýȯ +} + +/** + * ¾ÆÀ̵ð¾î + * 1. ¹üÀ§°¡ Å©Áö ¾ÊÀ½ + * 2. Á¸ÀçÇÏ´Â ¸ðµç Ä«µåÀÇ Á¾·ù´Â 6°³, Ä«µå 2ÀåÀÌ ÇÑ ½ÖÀ» ÀÌ·é´Ù. + * 3. µÚÁýÀ» Ä«µå ¼ø¼­¸¦ Á¤ÇÏ´Â ¸ðµç °æ¿ìÀÇ ¼ö´Â 6!(Ä«µå ¼ø¼­) * 2^6(2°³ÀÇ Ä«µå Áß ¾î¶² Ä«µå¸¦ ¸ÕÀú µÚÁýÀ»Áö) -> ºê·çÆ®Æ÷½º °¡´É + * 4. À̹ø¿¡ ¸ñÇ¥·Î ÇÏ´Â Ä«µå¿¡ ´ëÇØ ÇöÀç Ä¿¼­¿¡¼­ ¸ñÇ¥ Ä«µå±îÁö °¡´Â ÃÖ´Ü °æ·Î¸¦ ±¸Çϸç À̵¿ Ƚ¼ö ÀüºÎ ±¸ÇÏ°í ÃÖ¼Ú°ª °»½Å + * + * ±¸Çö + * 1. Á¸ÀçÇÏ´Â ¸ðµç Ä«µåÀÇ À§Ä¡¸¦ ÀúÀåÇϸç Ä«µåÀÇ °³¼ö ¼¼±â (findCard) + * 2. °¡´ÉÇÑ ¸ðµç Ä«µåÀÇ ¼ø¼­(next_permutation)¿Í °¢ Ä«µå¸¦ µÚÁýÀ» ¼ø¼­(bitmask)¸¦ °áÁ¤ + * ex) seq = {3, 1, 2}, bit = 011 ÀÏ ¶§ + * 3¹ø, 1¹ø, 2¹ø Ä«µåÀÇ ¼ø¼­·Î µÚÁý´Â´Ù. + * 3¹ø Ä«µå´Â 1¹ø° Ä«µåºÎÅÍ, 1¹ø Ä«µå´Â 0¹ø° Ä«µåºÎÅÍ, 2¹ø Ä«µå´Â 1¹ø° Ä«µåºÎÅÍ µÚÁý´Â´Ù. + * bitÀÇ 011ÀÌ ¾Õ¿¡¼­ºÎÅÍ °¢°¢ 1, 2, 3¹ø Ä«µå¿Í ´ëÀÀÇÔ + * 3. ÇöÀç Ä«µå ¼ø¼­¿Í °¢ Ä«µå¸¦ µÚÁý´Â ¼ø¼­¿¡ ´ëÇÑ Ä¿¼­ À̵¿ Ƚ¼ö °è»ê (matchCard) + * ÇöÀç Ä¿¼­ À§Ä¡¿Í ¸ñÇ¥ Ä«µå À§Ä¡¿¡ ´ëÇØ bfs ÇÔ¼ö ½ÇÇà + * ÄÁÆ®·Ñ ÀÔ·ÂÀ» °í·ÁÇØ¾ß Çϱ⠶§¹®¿¡ 4¹æÇâ¿¡ ´ëÇÑ ¹æÇâ À̵¿¿¡ Ãß°¡·Î ÄÁÆ®·Ñ ÀԷµµ ó¸®ÇÑ´Ù.(ctrl) + * 4. ¸Å Á¶ÇÕ¿¡ µû¶ó board°¡ °»½ÅµÇ¹Ç·Î board¸¦ º¹»çÇÑ tmp »ç¿ë + * °ø½Ä Ç®ÀÌ : https://tech.kakao.com/2021/01/25/2021-kakao-recruitment-round-1/ + */ +int main() { + vector> board = { {1, 0, 0, 3}, + {2, 0, 0, 0}, + {0, 0, 0, 2}, + {3, 0, 1, 0} }; //Ãʱ⼳Á¤ + cout << solution(board, 1, 0); //Ãâ·Â +} \ No newline at end of file