문제
우리는 2차원 숫자 배열 arr을 유일한 인수로 취하는 JavaScript 함수를 작성해야 합니다.
배열의 숫자는 -
일 수 있습니다.-
빈 셀을 나타내는 값 0;
-
신선한 토마토를 나타내는 값 1,
-
썩은 토마토를 나타내는 값 2입니다.
1분마다 썩은 토마토에 인접한(4방향) 신선한 토마토는 썩게 됩니다.
우리의 함수는 세포에 신선한 토마토가 없을 때까지 경과해야 하는 최소 시간(분)을 반환해야 합니다. 이것이 불가능하면 대신 -1을 반환해야 합니다.
예를 들어, 함수에 대한 입력이 -
인 경우const arr = [ [2, 1, 1], [1, 1, 0], [0, 1, 1] ];
그러면 출력은 다음과 같아야 합니다. -
const output = 4;
출력 설명
| 경과 시간 | 토마토 상태 |
|---|---|
| 1 | [ [2, 2, 1], [2, 1, 0], [0, 1, 1] ] |
| 2 | [ [2, 2, 2], [2, 2, 0], [0, 1, 1] ] |
| 3 | [ [2, 2, 2], [2, 2, 0], [0, 2, 1] ] |
| 4 | [ [2, 2, 2], [2, 2, 0], [0, 2, 2] ] |
예시
이에 대한 코드는 -
const arr = [
[2, 1, 1],
[1, 1, 0],
[0, 1, 1]
];
const timeToRot = (arr = []) => {
let fresh = 0;
let count = -1;
let curr = [];
for(let i = 0; i < arr.length; i++){
for(let j = 0; j < arr[i].length; j++){
if(arr[i][j] === 1){
fresh += 1;
};
if(arr[i][j] === 2){
curr.push([i, j]);
};
};
};
if(!fresh){
return 0;
};
while(curr.length > 0){
count += 1;
const next = [];
const rotten = (i, j) => {
arr[i][j] = 2
next.push([i, j])
fresh -= 1
};
for(const [i, j] of curr){
if (arr[i - 1] && arr[i - 1][j] === 1) {
rotten(i - 1, j);
};
if (arr[i + 1] && arr[i + 1][j] === 1) {
rotten(i + 1, j);
};
if (arr[i][j - 1] === 1) {
rotten(i, j - 1);
};
if (arr[i][j + 1] === 1) {
rotten(i, j + 1);
};
}
curr = next
};
return fresh === 0 ? count : -1;
};
console.log(timeToRot(arr)); 출력
콘솔의 출력은 -
4