기초다지기/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에 위치를 추가
  •