문제
https://school.programmers.co.kr/learn/courses/30/lessons/120866
풀이
배열을 돌면서, 1이 나오면 그 주변을 x로 변경한다. 단 1이 적혀있는 경우에는 1을 유지한다.
배열을 다 순환한 다음에 0의 갯수를 세어 반환한다.
function solution(board) {
board.forEach((line, i) => {
line.forEach((cell, j) => {
if (cell === 1) {
// 왼쪽
if (j > 0 && board[i][j - 1] !== 1) {
board[i][j - 1] = "x";
}
// 오른쪽
if (j < line.length - 1 && board[i][j + 1] !== 1) {
board[i][j + 1] = "x";
}
// 위
if (i > 0 && board[i - 1][j] !== 1) {
board[i - 1][j] = "x";
}
// 아래
if (i < board.length - 1 && board[i + 1][j] !== 1) {
board[i + 1][j] = "x";
}
// 위의 왼쪽
if (i > 0 && j > 0 && board[i - 1][j - 1] !== 1) {
board[i - 1][j - 1] = "x";
}
// 위의 오른쪽
if (i > 0 && j < line.length - 1 && board[i - 1][j + 1] !== 1) {
board[i - 1][j + 1] = "x";
}
// 아래의 왼쪽
if (i < board.length - 1 && j > 0 && board[i + 1][j - 1] !== 1) {
board[i + 1][j - 1] = "x";
}
// 아래의 오른쪽
if (i < board.length - 1 && j < line.length - 1 && board[i + 1][j + 1] !== 1) {
board[i + 1][j + 1] = "x";
}
}
});
});
//배열을 돌며 0인 부분의 갯수 반환
const arr = board.reduce((acc, line) => acc.concat(line), []);
return arr.filter((el) => el === 0).length;
}
다른 풀이
function solution(board) {
let outside = [[-1,0], [-1,-1], [-1,1], [0,-1],[0,1],[1,0], [1,-1], [1,1]];
let safezone = 0;
board.forEach((row, y, self) => row.forEach((it, x) => {
if (it === 1) return false;
return outside.some(([oy, ox]) => !!self[oy + y]?.[ox + x])
? false : safezone++;
}));
return safezone;
}
현재 셀을 기준으로 인접한 8개 셀의 상대적 위치를 나타낸다. 예를 들어, [-1, 0]은 현재 셀 바로 위의 셀을 의미한다.
let outside = [[-1,0], [-1,-1], [-1,1], [0,-1],[0,1],[1,0], [1,-1], [1,1]];
safezone은 안전구역의 수를 의미한다.
if (it === 1) return false;
현재 셀이 1이라면 안전구역이 아니므로 false를 반환한다.
return outside.some(([oy, ox]) => !!self[oy + y]?.[ox + x])
? false : safezone++;
outside 배열을 순회하며 인접한 셀을 확인한다.
self[oy + y]?.[ox + x]는 인접한 셀의 값을 가져온다. (옵셔널 체이닝(?.)을 사용하여 배열 범위를 벗어나는 경우를 처리)
!!는 값을 boolean으로 변환 => 즉, 셀이 존재하고 값이 1(지뢰)이면 true, 그렇지 않으면 false
- 하나라도 true를 반환하면 (즉, 인접한 셀 중 하나라도 지뢰가 있으면) 전체 표현식이 true가 된다.
- 삼항 연산자(? :)를 사용하여, 인접한 셀에 지뢰가 있으면 false를 반환하고, 없으면 safezone을 1 증가시킨다.
'개발 > 알고리즘(코딩테스트)' 카테고리의 다른 글
프로그래머스, 자바스크립트) 수박수박수박수박수박수? (0) | 2024.06.22 |
---|---|
프로그래머스, 자바스크립트) 정수를 나선형으로 배치하기 (0) | 2024.06.16 |
프로그래머스, 자바스크립트) 주사위 게임 3 (0) | 2024.06.07 |
프로그래머스, 자바스크립트) 분수의 덧셈 (0) | 2024.06.06 |
프로그래머스, 자바스크립트) 연속된 수의 합 (0) | 2024.06.06 |