https://school.programmers.co.kr/learn/courses/30/lessons/72415
๋ฌธ์ ์ค๋ช
๊ฒ์ ๊ฐ๋ฐ์์ธ ๋ฒ ๋ก๋๋ ๊ฐ๋ฐ ์ฐ์ต์ ์ํด ๋ค์๊ณผ ๊ฐ์ ๊ฐ๋จํ ์นด๋ ์ง๋ง์ถ๊ธฐ ๋ณด๋ ๊ฒ์์ ๊ฐ๋ฐํด ๋ณด๋ ค๊ณ ํฉ๋๋ค.
๊ฒ์์ด ์์๋๋ฉด ํ๋ฉด์๋ ์นด๋ 16์ฅ์ด ๋ท๋ฉด์ ์๋กํ์ฌ 4 x 4 ํฌ๊ธฐ์ ๊ฒฉ์ ํํ๋ก ํ์๋์ด ์์ต๋๋ค. ๊ฐ ์นด๋์ ์๋ฉด์๋ ์นด์นด์คํ๋ ์ฆ ์บ๋ฆญํฐ ๊ทธ๋ฆผ์ด ๊ทธ๋ ค์ ธ ์์ผ๋ฉฐ, 8๊ฐ์ง์ ์บ๋ฆญํฐ ๊ทธ๋ฆผ์ด ๊ทธ๋ ค์ง ์นด๋๊ฐ ๊ฐ๊ธฐ 2์ฅ์ฉ ํ๋ฉด์ ๋ฌด์์๋ก ๋ฐฐ์น๋์ด ์์ต๋๋ค.
์ ์ ๊ฐ ์นด๋๋ฅผ 2์ฅ ์ ํํ์ฌ ์๋ฉด์ผ๋ก ๋ค์ง์์ ๋ ๊ฐ์ ๊ทธ๋ฆผ์ด ๊ทธ๋ ค์ง ์นด๋๋ฉด ํด๋น ์นด๋๋ ๊ฒ์ ํ๋ฉด์์ ์ฌ๋ผ์ง๋ฉฐ, ๊ฐ์ ๊ทธ๋ฆผ์ด ์๋๋ผ๋ฉด ์๋ ์ํ๋ก ๋ท๋ฉด์ด ๋ณด์ด๋๋ก ๋ค์งํ๋๋ค. ์ด์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ๋ชจ๋ ์นด๋๋ฅผ ํ๋ฉด์์ ์ฌ๋ผ์ง๊ฒ ํ๋ฉด ๊ฒ์์ด ์ข ๋ฃ๋ฉ๋๋ค.
๊ฒ์์์ ์นด๋๋ฅผ ์ ํํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์นด๋๋ ์ปค์๋ฅผ ์ด์ฉํด์ ์ ํํ ์ ์์ต๋๋ค.
- ์ปค์๋ 4 x 4 ํ๋ฉด์์ ์ ์ ๊ฐ ์ ํํ ํ์ฌ ์์น๋ฅผ ํ์ํ๋ "๊ตต๊ณ ๋นจ๊ฐ ํ ๋๋ฆฌ ์์"๋ฅผ ์๋ฏธํฉ๋๋ค.
- ์ปค์๋ [Ctrl] ํค์ ๋ฐฉํฅํค์ ์ํด ์ด๋๋๋ฉฐ ํค ์กฐ์๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋ฐฉํฅํค ←, ↑, ↓, → ์ค ํ๋๋ฅผ ๋๋ฅด๋ฉด, ์ปค์๊ฐ ๋๋ฅธ ํค ๋ฐฉํฅ์ผ๋ก 1์นธ ์ด๋ํฉ๋๋ค.
- [Ctrl] ํค๋ฅผ ๋๋ฅธ ์ํ์์ ๋ฐฉํฅํค ←, ↑, ↓, → ์ค ํ๋๋ฅผ ๋๋ฅด๋ฉด, ๋๋ฅธ ํค ๋ฐฉํฅ์ ์๋ ๊ฐ์ฅ ๊ฐ๊น์ด ์นด๋๋ก ํ๋ฒ์ ์ด๋ํฉ๋๋ค.
- ๋ง์ฝ, ํด๋น ๋ฐฉํฅ์ ์นด๋๊ฐ ํ๋๋ ์๋ค๋ฉด ๊ทธ ๋ฐฉํฅ์ ๊ฐ์ฅ ๋ง์ง๋ง ์นธ์ผ๋ก ์ด๋ํฉ๋๋ค.
- ๋ง์ฝ, ๋๋ฅธ ํค ๋ฐฉํฅ์ผ๋ก ์ด๋ ๊ฐ๋ฅํ ์นด๋ ๋๋ ๋น ๊ณต๊ฐ์ด ์์ด ์ด๋ํ ์ ์๋ค๋ฉด ์ปค์๋ ์์ง์ด์ง ์์ต๋๋ค.
- ์ปค์๊ฐ ์์นํ ์นด๋๋ฅผ ๋ค์ง๊ธฐ ์ํด์๋ [Enter] ํค๋ฅผ ์
๋ ฅํฉ๋๋ค.
- [Enter] ํค๋ฅผ ์
๋ ฅํด์ ์นด๋๋ฅผ ๋ค์ง์์ ๋
- ์๋ฉด์ด ๋ณด์ด๋ ์นด๋๊ฐ 1์ฅ ๋ฟ์ด๋ผ๋ฉด ๊ทธ๋ฆผ์ ๋ง์ถ ์ ์์ผ๋ฏ๋ก ๋๋ฒ์งธ ์นด๋๋ฅผ ๋ค์ง์ ๋ ๊น์ง ์๋ฉด์ ์ ์งํฉ๋๋ค.
- ์๋ฉด์ด ๋ณด์ด๋ ์นด๋๊ฐ 2์ฅ์ด ๋ ๊ฒฝ์ฐ, ๋๊ฐ์ ์นด๋์ ๊ทธ๋ ค์ง ๊ทธ๋ฆผ์ด ๊ฐ์ผ๋ฉด ํด๋น ์นด๋๋ค์ด ํ๋ฉด์์ ์ฌ๋ผ์ง๋ฉฐ, ๊ทธ๋ฆผ์ด ๋ค๋ฅด๋ค๋ฉด ๋ ์นด๋ ๋ชจ๋ ๋ท๋ฉด์ด ๋ณด์ด๋๋ก ๋ค์ ๋ค์งํ๋๋ค.
- [Enter] ํค๋ฅผ ์
๋ ฅํด์ ์นด๋๋ฅผ ๋ค์ง์์ ๋
"๋ฒ ๋ก๋"๋ ๊ฒ์ ์งํ ์ค ์นด๋์ ์ง์ ๋ง์ถฐ ๋ช ์ฅ ์ ๊ฑฐ๋ ์ํ์์ ์นด๋ ์๋ฉด์ ๊ทธ๋ฆผ์ ์๊ณ ์๋ค๋ฉด, ๋จ์ ์นด๋๋ฅผ ๋ชจ๋ ์ ๊ฑฐํ๋๋ฐ ํ์ํ ํค ์กฐ์ ํ์์ ์ต์๊ฐ์ ๊ตฌํด ๋ณด๋ ค๊ณ ํฉ๋๋ค. ํค ์กฐ์ ํ์๋ ๋ฐฉํฅํค์ [Enter] ํค๋ฅผ ๋๋ฅด๋ ๋์์ ๊ฐ๊ฐ ์กฐ์ ํ์ 1๋ก ๊ณ์ฐํ๋ฉฐ, [Ctrl] ํค์ ๋ฐฉํฅํค๋ฅผ ํจ๊ป ๋๋ฅด๋ ๋์ ๋ํ ์กฐ์ ํ์ 1๋ก ๊ณ์ฐํฉ๋๋ค.
๋ค์์ ์นด๋๊ฐ ๋ช ์ฅ ์ ๊ฑฐ๋ ์ํ์ ๊ฒ์ ํ๋ฉด์์ ์ปค์๋ฅผ ์ด๋ํ๋ ์์์ ๋๋ค.
์๋ ๊ทธ๋ฆผ์์ ๋น ์นธ์ ์ด๋ฏธ ์นด๋๊ฐ ์ ๊ฑฐ๋์ด ์์ด์ง ์นธ์ ์๋ฏธํ๋ฉฐ, ๊ทธ๋ฆผ์ด ๊ทธ๋ ค์ง ์นธ์ ์นด๋ ์ ๋ฉด์ ๊ทธ๋ ค์ง ๊ทธ๋ฆผ์ ๋ํ๋ ๋๋ค.
์์์์ ์ปค์๋ ๋๋ฒ์งธ ํ, ์ฒซ๋ฒ์งธ ์ด ์์น์์ ์์ํ์์ต๋๋ค.
[Enter] ์ ๋ ฅ, ↓ ์ด๋, [Ctrl]+→ ์ด๋, [Enter] ์ ๋ ฅ = ํค ์กฐ์ 4ํ
[Ctrl]+↑ ์ด๋, [Enter] ์ ๋ ฅ, [Ctrl]+← ์ด๋, [Ctrl]+↓ ์ด๋, [Enter] ์ ๋ ฅ = ํค ์กฐ์ 5ํ
[Ctrl]+→ ์ด๋, [Enter] ์ ๋ ฅ, [Ctrl]+↑ ์ด๋, [Ctrl]+← ์ด๋, [Enter] ์ ๋ ฅ = ํค ์กฐ์ 5ํ
์์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์ปค์๋ฅผ ์ด๋ํ์ฌ ์นด๋๋ฅผ ์ ํํ๊ณ ๊ทธ๋ฆผ์ ๋ง์ถ์ด ์นด๋๋ฅผ ๋ชจ๋ ์ ๊ฑฐํ๊ธฐ ์ํด์๋ ์ด 14๋ฒ(๋ฐฉํฅ ์ด๋ 8๋ฒ, [Enter] ํค ์ ๋ ฅ 6๋ฒ)์ ํค ์กฐ์ ํ์๊ฐ ํ์ํฉ๋๋ค.
[๋ฌธ์ ]
ํ์ฌ ์นด๋๊ฐ ๋์ธ ์ํ๋ฅผ ๋ํ๋ด๋ 2์ฐจ์ ๋ฐฐ์ด board์ ์ปค์์ ์ฒ์ ์์น r, c๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ๋ชจ๋ ์นด๋๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํ ํค ์กฐ์ ํ์์ ์ต์๊ฐ์ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด ์ฃผ์ธ์.
๋ด ํ์ด
์นด๋ ์์ด์ ๋ง๋ค์ด ๋ชจ๋ ์์ด์ ํค ์กฐ์ ํ์ ๊ตฌํ ๋ค, ํค ์กฐ์ ์ต์๊ฐ์ ๊ตฌํด์ผ ํ๋ค.
์ต์ ํค ์กฐ์ ํ์๋ BFS๋ฅผ ํตํด ๊ตฌํด์ฃผ์๋ค.
#include <string>
#include <vector>
#include <set>
#include <queue>
#include <algorithm>
#include <iostream>
using namespace std;
int dRow[4] = { 1, -1, 0, 0 };
int dCol[4] = { 0, 0, 1, -1 };
struct cursor
{
int row;
int col;
int count;
cursor(int _row, int _col, int _count)
{
row = _row;
col = _col;
count = _count;
}
};
int bfs(vector<vector<int>>& board, int card, int& startRow, int& startCol)
{
vector<vector<bool>> visited(board.size(), vector<bool>(board[0].size()));
queue<cursor> q;
q.push(cursor(startRow, startCol, 0));
while (!q.empty())
{
cursor curCursor = q.front();
q.pop();
int row = curCursor.row;
int col = curCursor.col;
if (board[row][col] == card)
{
startRow = row;
startCol = col;
board[row][col] = 0;
return curCursor.count + 1;
}
for (int i = 0; i < 4; ++i)
{
// ์ด๋
int nRow = row + dRow[i];
int nCol = col + dCol[i];
if (nRow < 0 || nRow >= board.size()
|| nCol < 0 || nCol >= board[0].size())
continue;
if (!visited[nRow][nCol])
{
visited[nRow][nCol] = true;
q.push(cursor(nRow, nCol, curCursor.count + 1));
}
// ctrl + ์ด๋
nRow = row;
nCol = col;
while (true)
{
if (nRow + dRow[i] < 0 || nRow + dRow[i] >= board.size()
|| nCol + dCol[i] < 0 || nCol + dCol[i] >= board[0].size())
break;
nRow += dRow[i];
nCol += dCol[i];
if (board[nRow][nCol])
break;
}
if (!visited[nRow][nCol])
{
visited[nRow][nCol] = true;
q.push(cursor(nRow, nCol, curCursor.count + 1));
}
}
}
return INT32_MAX;
}
int solution(vector<vector<int>> board, int r, int c) {
int answer = INT32_MAX;
set<int> cardset;
// ์นด๋ ์ข
๋ฅ๋ฅผ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
for (int r = 0; r < board.size(); ++r)
for (int c = 0; c < board[0].size(); ++c)
{
if (board[r][c])
cardset.insert(board[r][c]);
}
vector<int> cards(cardset.begin(), cardset.end());
// ์นด๋ ์ข
๋ฅ์ ์์ด๋ง๋ค ์
๋ ฅ ํ์ ๊ฒ์
do
{
int count = 0;
int startRow = r;
int startCol = c;
vector<vector<int>> curBoard = board;
for (auto c : cards)
{
count += bfs(curBoard, c, startRow, startCol) + bfs(curBoard, c, startRow, startCol);
}
answer = min(answer, count);
} while (next_permutation(cards.begin(), cards.end()));
return answer;
}
์ฑ์ ๊ฒฐ๊ณผ
'๐ฅ๏ธ Study Note > Coding Test' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค 1003] ํผ๋ณด๋์น ํจ์ (C++) (0) | 2023.10.25 |
---|---|
[Hacker Rank] Organizing Containers of Balls (C++) (1) | 2023.10.09 |
[ํ๋ก๊ทธ๋๋จธ์ค]level.3 - ๋ถ๋๋ณต๊ท (C++) (0) | 2023.10.04 |
[ํ๋ก๊ทธ๋๋จธ์ค]level.2 - ๊ฐ์ฅ ํฐ ์ ์ฌ๊ฐํ ์ฐพ๊ธฐ(C++) (0) | 2023.09.28 |
[ํ๋ก๊ทธ๋๋จธ์ค]level.3 - ๋ค๋จ๊ณ ์นซ์ ํ๋งค (C++) (0) | 2023.09.26 |