📕 문제 설명
다음 그림과 같이 지뢰가 있는 지역과 지뢰에 인접한 위, 아래, 좌, 우 대각선 칸을 모두 위험지역으로 분류합니다.
지뢰는 2차원 배열 board에 1로 표시되어 있고 board에는 지뢰가 매설 된 지역 1과, 지뢰가 없는 지역 0만 존재합니다.
지뢰가 매설된 지역의 지도 board가 매개변수로 주어질 때, 안전한 지역의 칸 수를 return하도록 solution 함수를 완성해주세요.
⭐ 제한사항
- board는 n * n 배열입니다.
- 1 ≤ n ≤ 100
- 지뢰는 1로 표시되어 있습니다.
- board에는 지뢰가 있는 지역 1과 지뢰가 없는 지역 0만 존재합니다.
💻 입출력 예
board | result |
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 1, 0, 0], [0, 0, 0, 0, 0]] | 16 |
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 1, 1, 0], [0, 0, 0, 0, 0]] | 13 |
[[1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1]] | 0 |
📚 입출력 예 설명
입출력 예 #1
- (3, 2)에 지뢰가 있으므로 지뢰가 있는 지역과 지뢰와 인접한 위, 아래, 좌, 우, 대각선 총 8칸은 위험지역입니다. 따라서 16을 return합니다.
입출력 예 #2
- (3, 2), (3, 3)에 지뢰가 있으므로 지뢰가 있는 지역과 지뢰와 인접한 위, 아래, 좌, 우, 대각선은 위험지역입니다. 따라서 위험지역을 제외한 칸 수 13을 return합니다.
입출력 예 #3
- 모든 지역에 지뢰가 있으므로 안전지역은 없습니다. 따라서 0을 return합니다.
😊 나의 답변
function solution(board) {
const arr = new Array(board.length).fill(0).map(() => new Array(board[0].length).fill(0));
board.forEach((row, i) => {
row.forEach((el, j) => {
if (el === 1) {
const neighbors = [
[i - 1, j - 1], [i - 1, j], [i - 1, j + 1],
[i, j - 1], [i, j], [i, j + 1],
[i + 1, j - 1], [i + 1, j], [i + 1, j + 1]
];
neighbors.forEach(([x, y]) => {
if (x >= 0 && x < board.length && y >= 0 && y < row.length) {
arr[x][y]++;
}
});
}
});
});
return [].concat(...arr).filter((v) => !v).length;
}
0으로 채워진 board와 동일한 크기의 2차원 배열 arr를 생성하고, 1인 요소(= 지뢰) 주변 요소를 증가시킨다.
concat() 메서드로 2차원 배열을 결합하여 1차원 배열을 만들고, filter로 0인 요소만 남기고 필터링하여 배열의 길이를 반환한다.
정답률 58%였는데 생각보다 막힘없이 풀이했다.
🤔 살짝 헷갈렸던 부분
board와 동일한 크기, 0으로 채워진 2차원 배열 생성
const arr = new Array(board.length).fill(new Array(board[0].length).fill(0))
처음에 위의 코드처럼 생성했을 때, 다른 코드들은 제대로 작성한 것 같은데 다른 요소들도 함께 증가됐다.
알고보니 fill() 메서드로 2차원 배열을 초기화하려는 부분에서 문제가 발생했다.
안쪽 배열의 참조가 공유되기 때문에 모든 내부 배열이 같은 객체를 참조하게 되어 하나의 값을 바꾸면 모든 값이 변경되는 것이었다 🙄
const arr = new Array(board.length).fill(0).map(() => new Array(board[0].length).fill(0));
이렇게 변경하니 정답처리 되었다 😁
⭐ 참고할 답변
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;
}
728x90
반응형
'프로그래머스 > Lv. 0 코딩테스트 입문' 카테고리의 다른 글
[프로그래머스] Lv.0 소인수분해 / JS (0) | 2023.08.28 |
---|---|
[프로그래머스] Lv.0 캐릭터의 좌표 / JS (0) | 2023.08.25 |
[프로그래머스] Lv.0 배열 자르기 / JS (0) | 2023.08.24 |
[프로그래머스] Lv.0 외계행성의 나이 / JS (1) | 2023.08.24 |
[프로그래머스] Lv.0 진료순서 정하기 / JS (0) | 2023.08.24 |