티스토리 뷰
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]==0) break; 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]==0) break; arr[x][i] = c; } } flag = false; // 왼쪽 살피기 for(int i=y-1;i>=0;i--) { if(arr[x][i]==0) break; 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]==0) break; 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]==0) break; 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]==0) break; arr[i][y] = c; } } flag = false; // 위로 살피기 for(int i=x-2;i>=0;i--) { if(arr[i][y]==0) break; 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]==0) break; 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]==0) break; 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]==0) break; arr[i][j] = c; } } flag = false; // 오른쪽 위 점검 for(int i=x-2,j=y+2;i>=0&&j<n;i--,j++) { if(arr[i][j]==0) break; 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]==0) break; arr[i][j] = c; } } flag = false; // 왼쪽 아래 점검 for(int i=x+2,j=y-2;i<n&&j>=0;i++,j--) { if(arr[i][j]==0) break; 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]==0) break; arr[i][j] = c; } } flag = false; // 왼쪽 위 점검 for(int i=x-2,j=y-2;i>=0&&j>=0;i--,j--) { if(arr[i][j]==0) break; 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]==0) break; arr[i][j] = c; } return; } flag = false; } } | cs |
'알고리즘 > SW Expert' 카테고리의 다른 글
[SW Expert] 4522. 세상의 모든 팰린드롬 (0) | 2018.08.23 |
---|---|
[SW Expert] 4579. 세상의 모든 팰린드롬 2 (0) | 2018.08.23 |
[SW Expert] 4676. 늘어지는 소리 만들기 (0) | 2018.08.23 |
[SW Expert] 4751. 다솔이의 다이아몬드 장식 (0) | 2018.08.23 |
[SW Expert] 4789. 성공적인 공연 기획 (0) | 2018.08.23 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday