[프로그래머스] 안전지대 - JS

Lenny·2023년 6월 28일

문제

풀이

function solution(board) {
    // 좌표상에서 위 아래 좌 우 대각선 확인을 위한 배열.
    // dx는 x축, dy는 y축
    // 아래 배열을 x,y쌍으로 묶어서 표현하면 [1, 0], [0, 1], [-1, 0], [0, -1], [1, 1], [1, -1], [-1, 1], [-1, -1]
    // 2차원 좌표상에 나타내면 중심을 제외한 모든 방향에 점이 찍히는 형태로 표현됨
    const dx = [1, 0, -1, 0, 1, 1, -1, -1]; 
    const dy = [0, 1, 0, -1, 1, -1, 1, -1];
    
    // 배열의 길이를 표현
    const n = board.length; 
    
    let answer = n * n; // 초기 안전지대를 모든 칸으로 초기화
    
    const ch = []; // 지뢰가 있는 곳을 체크하는 배열
    
    // 모든 칸을 확인
    for(let i = 0; i < n; i++) {
        for (let j = 0; j < n; j++) {
            if(board[i][j] === 1) {
                // 지뢰를 발견하면 ch 배열에 지뢰의 위치를 push
                ch.push([i, j]);
                answer--; // 안전지대를 한 칸 빼줍니다. (지뢰가 있는 위치는 확정적으로 안전지대가 아니기 때문에)
            }
            
        }
    }
    
    // 모든 지역이 지뢰 밭일 경우
    if (answer === 0) return 0;
    
    
    // 지뢰 위치 확인
    ch.forEach((w) => {
        // w는 [0, 0] 이런 꼴로 지뢰가 있는 위치를 나타냄
        // 위, 아래, 좌우, 대각선 8 곳의 위치 확인 (k < 8)
        for(let k = 0; k < 8; k++) {
            // nx, ny는 지뢰가 있는 위치를 기준으로 팔방을 확인하는것
            const nx = w[0] + dx[k]; // x축 위치
            const ny = w[1] + dy[k]; // y축 위치
            
            // nx ny의 위치가 board의 안쪽이고 (nx >= 0 && ny >= 0 && nx < n && ny < n)
            // 이미 확인한 위험지역이나 지뢰의 위치가 아니라면 (board[nx][ny] === 0) *board[nx][ny] === 1 이 의미하는것은 해당 위치는 이미 위험지역으로 설정했다는 의미 + 지뢰가 있는 위치
            if(nx >= 0 && ny >= 0 && nx < n && ny < n && board[nx][ny] === 0) {
                board[nx][ny] = 1; // 위험 지대로 설정
                answer--; // 안전지대 카운팅 - 1
            }
            
        }
    })
    
    
    return answer;
}

제 두뇌로는 도저히 안되겠어서 다음 블로그를 보고 답을 제출했습니다.

답안 참고 블로그 링크

profile
🧑‍💻

0개의 댓글