본문 바로가기
반응형
Algorithm

[프로그래머스] Lv.0 안전지대 [JAVA]

by brightGarden02 2022. 10. 27.

* 순서

- 문제

- 문제설명

- 문제풀이

- 최종코드

 

- 문제

 

 

- 문제설명:

지뢰가 있는 지역은 1로 표시되며 위험지역이다..

지뢰가 있는 지역으로부터 왼쪽, 오른쪽, 위, 아래, 왼쪽위, 오른쪽위, 왼쪽아래, 오른쪽아래는 위험지역이다.

안전지역의 개수를 리턴한다.

 

 

- 문제풀이:

1. 1표시가 있는 지뢰가 있는 지역을 찾는다.

2. 지뢰를 찾았으면 왼쪽, 오른쪽, 위, 아래, 왼쪽위, 오른쪽위, 왼쪽아래, 오른쪽아래를 2로 표시한다.(위험지역이라는 임의표시)

3. 안전지역인 0개수를 구한다.

 

 

1. 1표시가 있는 지뢰가 있는 지역을 찾는다.

//1찾기
for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
        if(board[i][j] == 1) {
            checkDangerZone(i, j, board);
        }
    }
}

 

 

2. 지뢰를 찾았으면 왼쪽, 오른쪽, 위, 아래, 왼쪽위, 오른쪽위, 왼쪽아래, 오른쪽아래를 2로 표시한다.(위험지역이라는 임의표시)

checkDangerZone() 메서드 이용

private static void checkDangerZone(int i, int j, int[][] board) {

    int nowX = i;
    int nowY = j;
    for (int k = 0; k < 8; k++) {
        int nextX = nowX + dx[k];
        int nextY = nowY + dy[k];

        if(nextX >= 0 && nextY >= 0 && nextX < n && nextY < n) {

            //안전지역이라면 위험존 표시로 2로 채우기
            if(board[nextX][nextY] == 0) {
                board[nextX][nextY] = 2;
            }
        }
    }

}

 

 

3. 안전지역인 0개수를 구한다.

for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
        if(board[i][j] == 0) {
            answer++;
        }
    }
}

 

 

- 최종코드

package coding;

public class Main {

    private static int[] dx = {-1, 1, 0, 0, -1, 1, -1, 1};
    private static int[] dy = {0, 0, 1, -1, 1, 1, -1, -1};
    private static int n;

    public static void main(String[] args) {

//        int[][] board = {{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}};
//        int[][] board = {{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}};
        int[][] board = {{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}};

        int solution = solution(board);
        System.out.println("solution = " + solution);
    }


    public static int solution(int[][] board) {
        int answer = 0;

        n = board.length;

        //1찾기
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if(board[i][j] == 1) {
                    checkDangerZone(i, j, board);
                }
            }
        }

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if(board[i][j] == 0) {
                    answer++;
                }
            }
        }

        return answer;
    }

    private static void checkDangerZone(int i, int j, int[][] board) {

        int nowX = i;
        int nowY = j;
        for (int k = 0; k < 8; k++) {
            int nextX = nowX + dx[k];
            int nextY = nowY + dy[k];

            if(nextX >= 0 && nextY >= 0 && nextX < n && nextY < n) {

                //안전지역이라면 위험존 표시로 2로 채우기
                if(board[nextX][nextY] == 0) {
                    board[nextX][nextY] = 2;
                }
            }
        }

    }

}

댓글


반응형
반응형