Baekjoon [BaekJoon] 2206 번 벽 부수고 이동하기 문제 - (nodejs) - 728x90 문제 번호 : 2206문제 바로가기 ☞ https://www.acmicpc.net/problem/2206 <<< 문제 내용 >>> const fs = require("fs"); const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt"; let input = fs.readFileSync(filePath).toString().trim().split("\r\n"); const dy = [-1, 1, 0, 0]; const dx = [0, 0, -1, 1]; const [by, bx] = input[0].split(" ").map(Number); let visited = Array.from(Array(by), () => Array.from(Array(bx), () => new Array(2).fill(0)) ); input.shift(); input.map((el, i) => (input[i] = el.split(""))); const bfs = (cy, cx, breakCnt) => { visited[cy][cx][breakCnt] = 1; let queue = [[cy, cx, breakCnt]]; let idx = 0; while (idx !== queue.length) { [cy, cx, breakCnt] = queue[idx++]; if (cy === by - 1 && cx === bx - 1) { console.log(visited[cy][cx][breakCnt]); return; } for (let i = 0; i < 4; i++) { let [ny, nx] = [cy + dy[i], cx + dx[i]]; if (ny < 0 || ny >= by || nx < 0 || nx >= bx) continue; if (visited[ny][nx][breakCnt] === 0) { if (input[ny][nx] === "0") { visited[ny][nx][breakCnt] = visited[cy][cx][breakCnt] + 1; queue.push([ny, nx, breakCnt]); } else { if (breakCnt === 0) { // 만약 벽이고 벽을 안부시고 왔다면 visited[ny][nx][breakCnt + 1] = visited[cy][cx][breakCnt] + 1; queue.push([ny, nx, breakCnt + 1]); } } } } } console.log(-1); }; bfs(0, 0, 0); * 방문을 3차원 배열로 선언해주는 센스가 필요했다.. 2차원 배열로는 "문을 부수고 가지 않은 세계"와 "문을 부수고 난 이후의 세계"를 구분짓기가 어렵다. ✨ [이동 횟수를 세는 방법을 queue에 담는 방법을 사용했었는데 이 문제는 차원을 구분해서 횟수를 추산해야 하기 때문에, 방문(visited)에 기록해주도록 한다.] 이제는 유형을 알았으니.. 비슷한 문제가 나와도 풀 수 있겠지만 구글링 전에는 왜 안되지? 소리가 절로 나왔을 법 한 문제였다. 도움이 되셨다면 공감 부탁드립니다. 공유하기 URL 복사카카오톡 공유페이스북 공유엑스 공유 게시글 관리 구독하기MoveRoad's Factory 저작자표시 Contents 당신이 좋아할만한 콘텐츠 [BaekJoon] 16932 번 모양 만들기 문제 - (nodejs) 2022.02.10 [BaekJoon] 2644 번 촌수계산 문제 - (nodejs) 2022.02.09 [BaekJoon] 3190 번 뱀 문제 - (nodejs) 2022.02.05 [BaekJoon] 24268 번 2022는 무엇이 특별할까? 문제 - (nodejs) 2022.02.03 댓글 0 + 이전 댓글 더보기