문제 설명

지뢰가 있는 지역과 지뢰에 인접한 위, 아래, 좌, 우 대각선 칸을 모두 위험지역으로 분류할 때, 안전한 지역의 칸 수를 return

https://school.programmers.co.kr/learn/courses/30/lessons/120866

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 풀이법

우선 지역의 상, 하, 좌, 우, 대각선 총 8칸에 대한 배열 dy, dx를 생성한다

이중 for문을 돌며, 지뢰가 있는 지역이면 상, 하, 좌, 우, 대각선을 모두 위험 지역으로 -1로 표시해준다

이때, 상, 하, 좌, 우가 board의 범위를 넘어서는 안되며, 안전한 지역인 경우에만 위험 지역으로 표시해야한다

 

표시가 끝나면 다시 이중 for문을 돌며 안전한 지역인 칸의 수를 센 후에 return 한다

 

 

 

소스 코드

#include <string>
#include <vector>

using namespace std;

int solution(vector<vector<int>> board) {
    int answer = 0;
    int dy[8] = {-1, 1, 0, 0, -1, -1, 1, 1};
    int dx[8] = {0, 0, -1, 1, -1, 1, -1, 1};
    
    int n = board.size();
    
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (board[i][j] == 1) {
                for (int k = 0; k < 8; k++) {
                    int ny = i + dy[k];
                    int nx = j + dx[k];
                    
                    if (ny >= 0 && ny < n && 
                        nx >= 0 && nx < n &&
                        board[ny][nx] == 0) {
                        board[ny][nx] = -1;
                    }
                }
            }
        }
    }
    
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (board[i][j] == 0)
                answer++;
        }
    }
    
    return answer;
}
복사했습니다!