[JavaScript] ํ๋ก๊ทธ๋๋จธ์ค - ์นด๋ ์ง ๋ง์ถ๊ธฐ
[๋ฌธ์ ]
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 ํจ์๋ฅผ ์์ฑํด ์ฃผ์ธ์.
[์ ํ์ฌํญ]
- board๋ 4 x 4 ํฌ๊ธฐ์ 2์ฐจ์ ๋ฐฐ์ด์ ๋๋ค.
- board ๋ฐฐ์ด์ ๊ฐ ์์๋ 0 ์ด์ 6 ์ดํ์ธ ์์ฐ์์
๋๋ค.
- 0์ ์นด๋๊ฐ ์ ๊ฑฐ๋ ๋น ์นธ์ ๋ํ๋ ๋๋ค.
- 1 ๋ถํฐ 6๊น์ง์ ์์ฐ์๋ 2๊ฐ์ฉ ๋ค์ด์์ผ๋ฉฐ ๊ฐ์ ์ซ์๋ ๊ฐ์ ๊ทธ๋ฆผ์ ์นด๋๋ฅผ ์๋ฏธํฉ๋๋ค.
- ๋ค์ง์ ์นด๋๊ฐ ์๋ ๊ฒฝ์ฐ(board์ ๋ชจ๋ ์์๊ฐ 0์ธ ๊ฒฝ์ฐ)๋ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง์ง ์์ต๋๋ค.
- r์ ์ปค์์ ์ต์ด ์ธ๋ก(ํ) ์์น๋ฅผ ์๋ฏธํฉ๋๋ค.
- c๋ ์ปค์์ ์ต์ด ๊ฐ๋ก(์ด) ์์น๋ฅผ ์๋ฏธํฉ๋๋ค.
- r๊ณผ c๋ 0 ์ด์ 3 ์ดํ์ธ ์ ์์ ๋๋ค.
- ๊ฒ์ ํ๋ฉด์ ์ข์ธก ์๋จ์ด (0, 0), ์ฐ์ธก ํ๋จ์ด (3, 3) ์ ๋๋ค.
[์ ์ถ๋ ฅ ์]boardrcresult
[[1,0,0,3],[2,0,0,0],[0,0,0,2],[3,0,1,0]] | 1 | 0 | 14 |
[[3,0,0,2],[0,0,1,0],[0,1,0,0],[2,0,0,3]] | 0 | 1 | 16 |
์
์ถ๋ ฅ ์ #1
๋ฌธ์ ์ ์์์ ๊ฐ์ต๋๋ค.
์
์ถ๋ ฅ ์ #2
์
๋ ฅ์ผ๋ก ์ฃผ์ด์ง ๊ฒ์ ํ๋ฉด์ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ต๋๋ค.
์ ๊ฒ์ ํ๋ฉด์์ ๋ชจ๋ ์นด๋๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํ ํค ์กฐ์ ํ์์ ์ต์๊ฐ์ 16๋ฒ ์ ๋๋ค.
[ํ์ด]
์์ด๊ณผ bfs๋ฅผ ๋ชจ๋ ํ์ฉํ๋ ๋ฌธ์ ์ ๋๋ค.
1. ์นด๋์ ์์์์ ๊ตฌํฉ๋๋ค.
์์ 1๋ฒ์ฒ๋ผ ์นด๋์ ์ข ๋ฅ๊ฐ 1, 2, 3 ์ผ๋, ์ด๋ค ์นด๋์ ์์๋ก ๋ค์ง์ด์ผ ๋น ๋ฅธ์ง ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ 1, 2, 3์ ์์์์ ๋ชจ๋ ๊ตฌํฉ๋๋ค.
์นด๋๋ ๋ชจ๋ ์ง์ ์ด๋ฃจ๊ณ ์๊ธฐ ๋๋ฌธ์ 1, 2, 3 ์์๋ก ๋ฝ๋๋ค๋ฉด ์ฌ์ค 1, 1, 2, 2, 3, 3 ์์๋ก ๋ฝ์์ bfs๋ฅผ ์งํํฉ๋๋ค.
2. bfs๋ฅผ ํตํด ์์์ ๋ฐฐ์ด์ ์์๋๋ก ์นด๋๋ฅผ ํ๊ฐ์ฉ ์ฐพ์๋๊ฐ๋๋ค.
ํ๋ฅผ ์ด์ฉํ bfs๋ฅผ ์งํํ ๋, ๋๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์ด๋ ๊ฐ๋ฅํฉ๋๋ค.
- ctrl์ ๋๋ฅด๊ณ ์, ์๋, ์ค๋ฅธ์ชฝ, ์ผ์ชฝ 4๋ฐฉํฅ์ผ๋ก ์ด๋
- ํ์นธ์ฉ ์, ์๋, ์ค๋ฅธ์ชฝ, ์ผ์ชฝ 4๋ฐฉํฅ์ผ๋ก ์ด๋
๋ฐ๋ผ์ ์ด 8๊ฐ์ง ๋ฐฉํฅ์ผ๋ก ์ด๋์ํค๋ฉฐ ์นด๋๋ฅผ ์ฐพ์ต๋๋ค.
[์ฝ๋]
function solution(board, r, c) {
var answer = Infinity;
const n = board.length;
const set = new Set();
for(let i=0;i<n;i++) {
for(let j=0;j<n;j++) {
if(board[i][j] === 0) {
continue;
}
set.add(board[i][j]);
}
}
const bfs = (arr, boardArr) => {
const dx = [1, -1, 0, 0];
const dy = [0, 0, 1, -1];
let queue = [];
queue.push([r, c, 0]);
let cnt = 0;
let total = 0;
while(queue.length !== 0) {
const [x, y, move] = queue.shift();
if(boardArr[x][y] === arr[cnt]) {
queue = [];
boardArr[x][y] = 0;
// ์นด๋๋ฅผ ์ฐพ์์ ๋ค์ง๊ธฐ
total += move + 1;
queue.push([x, y, 0]);
cnt++;
if(cnt === arr.length) {
return total;
}
continue;
}
// ํ์นธ์ฉ ์ด๋
for(let i=0;i<4;i++) {
const [nx, ny] = [x + dx[i], y + dy[i]];
if(nx < 0 || ny < 0 || nx >= n || ny >= n) {
continue;
}
queue.push([nx, ny, move + 1]);
}
// ์ปจํธ๋กค + ์ด๋
// ํ์นธ์ฉ ์ด๋
for(let i=0;i<4;i++) {
let [cx, cy] = [x, y];
while(true) {
cx += dx[i];
cy += dy[i];
if(cx < 0 || cy < 0 || cx >= n || cy >= n) {
queue.push([cx - dx[i], cy - dy[i], move + 1]);
break;
}
if(boardArr[cx][cy] > 0) {
queue.push([cx, cy, move + 1]);
break;
}
}
}
}
}
// ์นด๋ ์ญ์ ํ ์์์ ๊ตฌํจ
const makeCardSet = (arr, cnt) => {
if(cnt === set.size*2) {
// ์์์์ด ์์ฑ๋๋ฉด ํด๋น ์์๋๋ก bfs ์งํ
const boardArr = Array.from({length: n}, () => Array(n).fill(0));
for(let i=0;i<n;i++) {
for(let j=0;j<n;j++) {
boardArr[i][j] = board[i][j];
}
}
const ret = bfs(arr, boardArr);
if(answer > ret) {
answer = ret;
}
return;
}
set.forEach((i) => {
if(!arr.includes(i)) {
arr[cnt] = i;
arr[cnt+1] = i;
makeCardSet(arr, cnt + 2);
arr[cnt] = 0;
arr[cnt+1] = 0;
}
});
}
makeCardSet([], 0);
return answer;
}