기초다지기/JS 코딩테스트
javaScript 지뢰찾기게임
김빵그
2024. 1. 29. 18:44
문제
주어진 이차원 배열로 표현된 지뢰찾기 게임에서 지뢰가 있는 위치 확인하고 주변 지뢰를 표시한 후 안전한 지역의 개수 계산
풀이
function solution(board) {
const n = board.length;
for (let y = 0; y < n; y++) {
for (let x = 0; x < n; x++) {
if (board[y][x] === 1) {
for (let dy = -1; dy <= 1; dy++) {
for (let dx = -1; dx <= 1; dx++) {
const ny = y + dy;
const nx = x + dx;
if (0 <= ny && ny < n && 0 <= nx && nx < n && board[ny][nx] !== 1) {
board[ny][nx] = "X";
}
}
}
}
}
}
return board.flat().filter(value => value === 0).length;
}
- for
- 각 칸을 순회하면서 지뢰가 있는 위치 찾음 (y, x)
- 현재 위치에 지뢰가 있으면 board[y][x] === 1
- 지뢰 주변의 8방향 검사
- 현재 위치에서 주변 위치로 이동한 새로운 좌표 계산
- 검사한 위치가 보드 내에 있고 해당 칸이 지뢰가 아니라면 x 표시
- x와 1로 표시된 칸을 제외한 안전한 지역의 개수 계산
다른 풀이
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방향 확인하기 위한 좌표 정의
- safezone 안전한 지역 개수 변수
- forEach
- 바깥쪽은 행, 안쪽은 열
- 현재 위치에 지뢰 있으면 무시 하고 다음칸
- 주변 8방향에 지뢰가 하나라도 있으면 해당칸 무시하고 안전한 지역 개수 증가 x
function solution(b) {
const directions = [[0,0],[0,1],[0,-1],[1,1],[1,0],[1,-1],[-1,-1],[-1,0],[-1,1]]
let bombSet = new Set();
for(let i = 0; i < b.length; i++) {
for(let j = 0; j < b[i].length; j++) {
if(b[i][j] == 1) {
directions.forEach(el => {
let [nextX, nextY] = el;
[nextX, nextY] = [i+nextX, j+nextY];
if(nextX >= 0 && nextX < b.length && nextY >= 0 && nextY < b[i].length) {
bombSet.add(nextX+' '+nextY);
}
})
}
}
}
return b.length * b[0].length - bombSet.size;
}
- directions : 주변 8방향 표현 배열
- bombSet : 지뢰 위치와 주변 8방향의 위치를 저장하기 위한 Set
- for
- 배열 b의 모든 요소 순회
- 현재 위치에 지뢰가 있으면 주변 8방향 순회하여 Set에 위치를 추가