Javascript - 안전지대

이율곡·2023년 7월 22일

Programmers

목록 보기
40/44
post-thumbnail

안전지대

문제

다음 그림과 같이 지뢰가 있는 지역과 지뢰에 인접한 위, 아래, 좌, 우 대각선 칸을 모두 위험지역으로 분류합니다.

지뢰는 2차원 배열 board에 1로 표시되어 있고 board에는 지뢰가 매설 된 지역 1과, 지뢰가 없는 지역 0만 존재합니다.
지뢰가 매설된 지역의 지도 board가 매개변수로 주어질 때, 안전한 지역의 칸 수를 return하도록 solution 함수를 완성해주세요.

입출력 예

boardresult
[[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. 2차원 배열 전체를 순회하면서 지뢰가 있는 위치를 발견
  2. 그 위치의 상하좌우 대각선을 탐색하여 안전 지역을 찾기.
  3. 모든 칸을 안전 지역으로 가정하고 시작.
  4. 지뢰 또는 지뢰 주변을 찾을 때마다 안전 지역의 수를 줄이기.

풀이

function solution(board) {
    const dx = [-1, 0, 1, -1, 1, -1, 0, 1];
    const dy = [-1, -1, -1, 0, 0, 1, 1, 1];
    const n = board.length;
    const m = board[0].length;
    let safeArea = n * m;

    for(let i = 0; i < n; i++){
        for(let j = 0; j < m; j++){
            if(board[i][j] === 1){
                for(let k = 0; k < 8; k++){
                    const nx = i + dx[k];
                    const ny = j + dy[k];
                    if(nx >= 0 && nx < n && ny >= 0 && ny < m){
                        if(board[nx][ny] === 0){
                            board[nx][ny] = 2;
                            safeArea--;
                        }
                    }
                }
                safeArea--;
            }
        }
    }
    return safeArea;
}

너무 복잡한 문제지만, 하나하나 살펴보면 된다. 먼저 dx, dy 배열을 통해 현재 위치에서 상하좌우 대각선을 탐색할 수 있는 방향을 설정한다.

그 후 2차원 배열 전체를 순회하면서 지뢰가 있는 칸을 찾는다. 지뢰가 있는 칸을 발견하면, dx, dy를 이용해 상하좌우 대각선을 탐색하고, 그 위치가 안전 지역(0)이면 위험지역(2)으로 표시하고 안전 지역 카운트를 하나 줄인다.

마지막으로 지뢰가 있는 칸은 안전 지역에서 빼줍니다. 모든 칸을 검사한 후에 남은 안전 지역의 수를 반환합니다.


정리하기

이 문제는 2차원 배열에 대한 이해와 지뢰가 위치한 주변 영역을 찾는 문제다. 그래서 2차원 배열 탐색과 조건에 따른 값을 분류하는 능력을 필요로 하기 때문에 조금은 까다로운 문제였다.

profile
음악을 좋아하는 사람이 음악을 만들 듯, 개발을 좋아하게 될 사람이 쓰는 개발이야기

1개의 댓글

comment-user-thumbnail
2023년 7월 22일

정말 흥미진진했습니다! 2차원 배열에 대한 이해도가 향상되는 기분이에요. 좋은 글 감사합니다!

답글 달기