티스토리 뷰

1) 생각

오셀로 게임을 시작한다. 초기 조건은 N x N에 상관없이 다음과 같은 중앙 4개의 형태로 동일하다.

이제 오셀로를 두는 좌표를 준다. 이 좌표를 항상 둘 수있는 경우를 준다. 주어진 좌표들을 모두 두었을 때 흑과 백의 개수를 출력해라.


첫 번째 생각

돌을 하나 두었을 때, (위 아래) (좌 우) (대각 4방향)을 판단해 주어야한다.


두 번째 생각

예제의 답이 틀리게 나와 확인해보니 당연히 (x,y)로 주어질 줄 알았지만 (y,x) 로 주어지고 있었다.

2) 방안

1) 모든 경우의 수를 다 탐색 해주었다.

2) y와 x를 바꿔주었고, 배열의 크기를 N개로 생성하여서 x,y 각각 -1을 해주었다.

3) 오셀로를 놓았을 때, 뒤집는 과정에서 빈 공간 체크를 하지 않아서 예제는 답이 잘 나왔지만 제출시에는 틀린 값을 얻었다

> 0을 만날경우 반복문을 빠져나오도록 하였다.

>> 모든 경우의 수를 다 살펴봤지만 미로 찾기같은 탐색에서 사용하듯이 좌표를 미리 배열로 만들어놓고 사용하면 하나로 함축되면서 더 깔끔한 코드가 나올것이다.(일일히 나열했더니 코드가 너무 길어졌다)


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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
import java.io.IOException;
import java.util.Scanner;
 
public class Solution {
    static int[][] arr;
    static int n;
    public static void main(String[] args) throws IOException{
        Scanner sc = new Scanner(System.in);
        int tc = sc.nextInt();
        StringBuilder sb = new StringBuilder();
        for(int i=1;i<=tc;i++) {
            n = sc.nextInt();
            int m = sc.nextInt();
            arr = new int[n][n];
            // 가운대 고정 W B B W
            arr[n/2][n/2= 2;
            arr[n/2][n/2-1= 1;
            arr[n/2-1][n/2= 1;
            arr[n/2-1][n/2-1= 2;
 
            for(int j=0;j<m;j++) {
                int x = sc.nextInt()-1;
                int y = sc.nextInt()-1;
                int c = sc.nextInt(); // 1 흑, 2 백
                arr[y][x] = c;
                // 가로 바꾸기
                garo(c,y,x);
                // 세로 바꾸기
                sero(c,y,x);
                // 대각선 바꾸기
                degac(c,y,x);
            }
            int b = 0;
            int w = 0;
            for(int j=0;j<n;j++) {
                for(int k=0;k<n;k++) {
                    if(arr[j][k]==1) b++;
                    else if(arr[j][k]==2) w++;
                }
            }
            System.out.println("#"+i+" "+b+" "+w);
        }
    }
    
    private static void garo(int c,int x,int y) {
        boolean flag = false;
        // 오른쪽 살피기
        for(int i=y+1;i<n;i++) {
            if(arr[x][i]==0break;
            if(arr[x][i]==c) {
                flag = true;
                break;
            }
        }
        // 바꾸기
        if(flag) {
            for(int i=y+1;i<n;i++) {
                if(arr[x][i]==c||arr[x][i]==0break;
                arr[x][i] = c;
            }
        }
        flag = false;
        // 왼쪽 살피기
        for(int i=y-1;i>=0;i--) {
            if(arr[x][i]==0break;
            if(arr[x][i]==c) {
                flag = true;
                break;
            }
        }
        // 바꾸기
        if(flag) {
            for(int i=y-1;i>=0;i--) {
                if(arr[x][i]==c||arr[x][i]==0break;
                arr[x][i] = c;
            }
        }
    }
    
    private static void sero(int c,int x,int y) {
        boolean flag = false;
        // 아래로 살피기
        for(int i=x+2;i<n;i++) {
            if(arr[i][y]==0break;
            if(arr[i][y]==c) {
                flag = true;
                break;
            }
        }
        // 바꾸기
        if(flag) {
            for(int i=x+1;i<n;i++) {
                if(arr[i][y]==c||arr[i][y]==0break;
                arr[i][y] = c;
            }
        }
        flag = false;
        // 위로 살피기
        for(int i=x-2;i>=0;i--) {
            if(arr[i][y]==0break;
            if(arr[i][y]==c) {
                flag = true;
                break;
            }
        }
        // 바꾸기
        if(flag) {
            for(int i=x-1;i>=0;i--) {
                if(arr[i][y]==c||arr[i][y]==0break;
                arr[i][y] = c;
            }
        }
    }
    
    private static void degac(int c,int x,int y) {
        boolean flag = false;
        // 오른쪽 아래 점검
        for(int i=x+2,j=y+2;i<n&&j<n;i++,j++) {
            if(arr[i][j]==0break;
            if(arr[i][j]==c) {  
                flag = true;
                break;
            }
        }
        if(flag) {
            for(int i=x+1,j=y+1;i<n&&j<n;i++,j++) {
                if(arr[i][j]==c||arr[i][j]==0break;
                arr[i][j] = c;
            }
        }
        flag = false;
        // 오른쪽 위 점검
        for(int i=x-2,j=y+2;i>=0&&j<n;i--,j++) {
            if(arr[i][j]==0break;
            if(arr[i][j]==c) {  
                flag = true;
                break;
            }
        }
        if(flag) {
            for(int i=x-1,j=y+1;i>=0&&j<n;i--,j++) {
                if(arr[i][j]==c||arr[i][j]==0break;
                arr[i][j] = c;
            }
        }
        flag = false;
        // 왼쪽 아래 점검
        for(int i=x+2,j=y-2;i<n&&j>=0;i++,j--) {
            if(arr[i][j]==0break;
            if(arr[i][j]==c) {  
                flag = true;
                break;
            }
        }
        if(flag) {
            for(int i=x+1,j=y-1;i<n&&j>=0;i++,j--) {
                if(arr[i][j]==c||arr[i][j]==0break;
                arr[i][j] = c;
            }
        }
        flag = false;
        // 왼쪽 위 점검
        for(int i=x-2,j=y-2;i>=0&&j>=0;i--,j--) {
            if(arr[i][j]==0break;
            if(arr[i][j]==c) {  
                flag = true;
                break;
            }
        }
        if(flag) {
            for(int i=x-1,j=y-1;i>=0&&j>=0;i--,j--) {
                if(arr[i][j]==c||arr[i][j]==0break;
                arr[i][j] = c;
            }
            return;
        }
        flag = false;
    }
}
cs


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday