말하는 컴공감자의 텃밭

프로그래머스 안전지대 <2점> - 자바(java) 본문

알고리즘/Programmers - Java

프로그래머스 안전지대 <2점> - 자바(java)

현콩 2023. 6. 18. 12:43
728x90

프로그래머스 안전지대
간단해 보여

문제를 보고 이게 입문..인가? 싶었다.

그래도 입문이니까 하나하나 경우의 수 넣고 해보자~ 했다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
class Solution {
    public int solution(int[][] board) {
        int n = board.length;
        int answer = n * n; // 범위
        int[][] cnt = new int[n][n];
 
        for (int y = 0; y < n; y++) {
            for (int x = 0; x < n; x++) {
                if (board[y][x] == 1) { // 지뢰 찾았을때
                    cnt[y][x] = 1;      // 복사본 cnt 제자리 표기
                    if (y == 0) { 
                        if (x == 0) {            // 우측 하단 코너
                            cnt[y][x + 1= 1;
                            cnt[y + 1][x] = 1;
                            cnt[y + 1][x + 1= 1;
                        } else if (x == n - 1) { // 우측 상단 코너
                            cnt[y][x - 1= 1;
                            cnt[y + 1][x - 1= 1;
                            cnt[y + 1][x] = 1;
                        } else {                 // 12시 방향
                            cnt[y][x - 1= 1;
                            cnt[y][x + 1= 1;
                            cnt[y + 1][x] = 1;
                            cnt[y + 1][x - 1= 1;
                            cnt[y + 1][x + 1= 1;
                        }
                    }
 
                    if (y > 0 && x == 0) {       // 왼쪽 벽면
                        if (y == n - 1) {        // 왼쪽 하단 코너
                            cnt[y - 1][x] = 1;
                            cnt[y - 1][x + 1= 1;
                            cnt[y][x + 1= 1;
                        } else {
                            cnt[y - 1][x] = 1;
                            cnt[y - 1][x + 1= 1;
                            cnt[y][x + 1= 1;
                            cnt[y + 1][x] = 1;
                            cnt[y + 1][x + 1= 1;
                        }
                    }
 
                    if (y > 0 && x == n - 1) {   // 우측 벽면
                        if (y == n - 1) {        // 우측 하단 코너
                            cnt[y - 1][x] = 1;
                            cnt[y - 1][x - 1= 1;
                            cnt[y][x - 1= 1;
                        } else {
                            cnt[y - 1][x - 1= 1;
                            cnt[y - 1][x] = 1;
                            cnt[y][x - 1= 1;
                            cnt[y + 1][x - 1= 1;
                            cnt[y + 1][x] = 1;
                        }
                    }
 
                    if (y == n - 1 && x > 0 && x < n - 1) { // 6시 방향
                        cnt[y - 1][x - 1= 1;
                        cnt[y - 1][x] = 1;
                        cnt[y - 1][x + 1= 1;
                        cnt[y][x - 1= 1;
                        cnt[y][x + 1= 1;
                    }
 
                    if (y > 0 && x > 0 && y < n - 1 && x < n - 1) { // 중앙부분
                        cnt[y - 1][x - 1= 1;
                        cnt[y - 1][x] = 1;
                        cnt[y - 1][x + 1= 1;
                        cnt[y][x - 1= 1;
                        cnt[y][x + 1= 1;
                        cnt[y + 1][x - 1= 1;
                        cnt[y + 1][x] = 1;
                        cnt[y + 1][x + 1= 1;
                    }
 
                }
            } // second for
        } // first for
 
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (cnt[i][j] == 1) {
                    answer--// 1만큼 빼주기
                }
            }
        }
 
        return answer;
    }
}
 
cs

이럴거 같더라.

당연히 런타임 오류가 발생했다. 풀리긴 하겠다만 좋은 방식은 아니라고 생각했었다. 가독성도 떨어지고

배열을 복사하고 확인하는 절차는 너무 복잡하고 귀찮았다.

차라리 주변 범위를 배열에 넣어두고 조건을 두어서 체크해보는건 어떨까 했다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class Solution {
    public int solution(int[][] board) {
        int n = board.length;
        int answer = n*n;
 
        int[] dx = {-1, 0, 1, -1, 1, -1, 0, 1}; // 주변 범위 설정.
        int[] dy = {-1, -1, -1, 0, 0, 1, 1, 1};
 
        boolean[][] cnt = new boolean[n][n]; // 확인용 cnt 생성
 
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                for (int k = 0; k < 8; k++) {
                    int nx = i + dx[k];
                    int ny = j + dy[k];
                    if (board[i][j] == 1) {
                        cnt[i][j] = true;
                    }
 
                    if (nx >= 0 && nx < n && ny >= 0 && ny < n && board[nx][ny] == 1) {
                        // 테두리 범위 설정
                        cnt[i][j] = true;
                    }
                }
            }
        }
 
        for (int i = 0; i < cnt.length; i++) {
            for (int j = 0; j < cnt.length; j++) {
                if (cnt[i][j]) {
                    answer--;
                }
            }
        }
 
        return answer;
    }
}
 
cs

 

728x90
Comments