- 문제
- M x N인 문자로 된 배열에 시작점에서 전체에 소문이 퍼지는 시간을 리턴
- 1은 주민이 사는 곳, 0은 x, 하루에 상하좌우 한칸 바로 옆 집으로 퍼짐
- 시도
- 날짜를 세어줄 카운터를 선언
- 전달받은 시작점을 x로 변경 후 재귀를 시작해야 함
- 재귀를 여기부터 시작
- 베이스 케이스를 설정하자
- 마을을 서치해서 1인 값이 없으면 카운트 리턴
- 리커시브
- 반복문으로 작성해서 모든 x값에 대해 아래의 작업을 진행해야 함
- x지점을 찾아내고, x지점 상하좌우의 값 중 1인 값을 찾고, 1인 값을 x로 변경
- 카운트++
- 종료?
- 시간 내에 풀어내지 못하였음
- 레퍼런스를 보고 이해하기로 하였음
- 수도코드
const createMatrix = (village) => {
const gossipProtocol = function (village, row, col) {
let cnt = 0;
village[row] = village[row].substr(0,col) + 'x' + village[row].substr(col+1);
let finder = 1;
while (finder > 0) {
let locX = [];
for (let i = 0; i < village.length; i++) {
if (village[i].indexOf('x') !== -1) {
locX.push([i, village[i].indexOf('x')])
}
}
for (let j = 0; j < locX.length; j++) {
if (village[locX[j][0] - 1][locX[j][1]] === 1) {
}
}
for (let i = 0; i < village.length; i++) {
finder = finder * village[i].includes('1');
}
}
return cnt;
};
- 레퍼런스
const createMatrix = (village) => {
const matrix = [];
village.forEach((line) => {
const row = [];
for (let i = 0; i < line.length; i++) row.push(line[i]);
matrix.push(row);
});
return matrix;
};
const gossipProtocol = function (village, row, col) {
const R = village.length;
const C = village[0].length;
const matrix = createMatrix(village);
const MOVES = [
[-1, 0],
[1, 0],
[0, 1],
[0, -1],
];
const MAX_SIZE = R * C;
const isValid = (row, col) => row >= 0 && row < R && col >= 0 && col < C;
const queue = Array(MAX_SIZE);
let front = 0;
let rear = 0;
const isEmpty = (queue) => front === rear;
const enQueue = (queue, pos) => {
queue[rear] = pos;
rear = (rear + 1) % MAX_SIZE;
};
const deQueue = (queue) => {
const pos = queue[front];
front = (front + 1) % MAX_SIZE;
return pos;
};
let cnt = 0;
enQueue(queue, [row, col]);
matrix[row][col] = 0;
while (isEmpty(queue) === false) {
const [row, col] = deQueue(queue);
cnt = matrix[row][col];
MOVES.forEach((move) => {
const [rDiff, cDiff] = move;
const nextRow = row + rDiff;
const nextCol = col + cDiff;
if (isValid(nextRow, nextCol) && matrix[nextRow][nextCol] === '1') {
enQueue(queue, [nextRow, nextCol]);
matrix[nextRow][nextCol] = matrix[row][col] + 1;
}
});
}
return cnt;
};