토마토 상자 box가 격자로 주어져요. 1은 익은 토마토, 0은 안 익은 토마토, -1은 토마토가 없는 칸이에요.
하루가 지나면 익은 토마토는 상하좌우로 붙어 있는 안 익은 토마토를 익혀요. 모든 토마토가 익는 데 걸리는 최소 일수를 반환해요. 처음부터 다 익어 있으면 0, 아무리 지나도 다 익지 못하면 -1을 반환해요.
익은 토마토가 여러 개라도 걱정 없어요. 처음부터 익은 토마토를 모두 큐에 함께 넣고 BFS를 한 번 돌리면, 각 칸은 가장 가까운 토마토로부터 익는 날짜를 갖게 돼요.
예시
예시 1
예시 2
예시 3
제한 사항
- 1 ≤ 행, 열 ≤ 1,000
- 각 칸은 -1, 0, 1 중 하나예요.
거리 배열을 -1로 채우고, 처음 익은 토마토(1)를 모두 0일로 큐에 넣어요. BFS로 안 익은(0) 이웃을
현재 + 1일로 익히며 퍼뜨려요. 끝나고 아직 안 익은 0이 남아 있으면 -1, 아니면 거리 배열의 최댓값이 답이에요.javascriptCopy codefunction tomatoRipening(box) {const rows = box.length;const cols = box[0].length;const DX = [-1, 1, 0, 0];const DY = [0, 0, -1, 1];const dist = Array.from({ length: rows }, () => new Array(cols).fill(-1));const queue = [];let head = 0;for (let i = 0; i < rows; i++) {for (let j = 0; j < cols; j++) {if (box[i][j] === 1) {dist[i][j] = 0;queue.push([i, j]);}}}while (head < queue.length) {const [x, y] = queue[head++];for (let d = 0; d < 4; d++) {const nx = x + DX[d];const ny = y + DY[d];if (nx < 0 || ny < 0 || nx >= rows || ny >= cols) continue;if (box[nx][ny] === 0 && dist[nx][ny] === -1) {dist[nx][ny] = dist[x][y] + 1;queue.push([nx, ny]);}}}let days = 0;for (let i = 0; i < rows; i++) {for (let j = 0; j < cols; j++) {if (box[i][j] === 0 && dist[i][j] === -1) return -1;days = Math.max(days, dist[i][j]);}}return days;}
예시 테스트만 실행 (Cmd/Ctrl+Enter)
숨김 테스트까지 채점 (Cmd/Ctrl+Shift+Enter)
에디터를 불러오고 있어요…
코드를 작성하고Ctrl↵를 눌러 예시 테스트를 확인해 보세요.