티스토리 뷰

반응형


4615. 재미있는 오셀로 게임


[입력]

첫 번째 줄에 테스트 케이스의 수 T가 주어진다.

각 테스트 케이스의 첫 번째 줄에는 보드의 한 변의 길이 N과 플레이어가 돌을 놓는 횟수 M이 주어진다. N은 4, 6, 8 중 하나이다.

그 다음 M줄에는 돌을 놓을 위치와 돌의 색이 주어진다.

돌의 색이 1이면 흑돌, 2이면 백돌이다.

만약 3 2 1이 입력된다면 (3, 2) 위치에 흑돌을 놓는 것을 의미한다.

돌을 놓을 수 없는 곳은 입력으로 주어지지 않는다.


[출력]

각 테스트 케이스마다 게임이 끝난 후 보드 위의 흑돌, 백돌의 개수를 출력한다.

흑돌이 30개, 백돌이 34인 경우 30 34를 출력한다.


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
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
 
public class Solution4615 {
    static int[][] board;
    static int N;
 
    public static void run() throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int tc = Integer.parseInt(br.readLine());
        
        for(int T=0; T<tc; T++) {  // Number of test cases
            StringTokenizer st = new StringTokenizer(br.readLine());
            N = Integer.parseInt(st.nextToken());  // a side length
            int M = Integer.parseInt(st.nextToken());  // number of times
            
            int blackCnt = 0;
            int whiteCnt = 0;
            
            board = new int[N][N];  // 1:black, 2:white
            board[N/2-1][N/2-1= 2;  // setitng
            board[N/2][N/2-1= 1;
            board[N/2-1][N/2= 1;
            board[N/2][N/2= 2;
            
            for(int i=0; i<M; i++) { // Number of times
                st = new StringTokenizer(br.readLine());
                int x = Integer.parseInt(st.nextToken())-1;  // x coordinates
                int y = Integer.parseInt(st.nextToken())-1;  // y coordinates
                int color = Integer.parseInt(st.nextToken());  // stone color
                
                board[x][y] = color;
                othello(x, y, color);
            }
            
            for(int[] tempArr : board) {
                for(int tempVal : tempArr) {
                    if(tempVal == 1) blackCnt++;
                    else if(tempVal == 2) whiteCnt++;
                }
            }
            System.out.println("#" + (T+1+ " " + blackCnt + " " + whiteCnt);
        }
    }
    
    public static void othello(int x, int y, int color) {
        for (int ix = -1; ix <= 1; ix++) {    // (x,y) 의 주변에 있는 돌 탐색
            for (int iy = -1; iy <= 1; iy++) { 
                if (ix == 0 && iy == 0)
                    continue;
 
                int xx = x + ix;    // (x,y) 주변 돌 좌표
                int yy = y + iy;
 
                boolean check = false;    // (xx,yy)가 자신의 돌인지 체크
                while (xx >= 0 && xx < N && yy >= 0 && yy < N && board[xx][yy] != 0) {    
                    if(board[xx][yy] == color) {    // (xx,yy)가 자신의 돌일 경우 
                        check = true;
                        break;
                    }
                    xx += ix;    // 상대의 돌일 경우 자신의 돌이 나올 때까지 탐색 
                    yy += iy;
                }
                
                while(check) {
                    if(xx == x && yy == y) break;
                    board[xx][yy] = color;    // 상대 돌을 자신의 돌로 교체
                    xx -= ix;
                    yy -= iy;
                }
            }
        }
    }
    
    public static void main(String[] args) throws Exception {
        Solution4615.run();
    }    
}
 
cs


--

1      // T

4 12       // N, M

1 2 1      // (1, 2)에 흑돌 놓기

1 1 2      //( 1, 1)에 백돌 놓기

4 3 1

4 4 2

2 1 1

4 2 2

3 4 1

1 3 2

2 4 1

1 4 2

4 1 2

3 1 2

--

--

#1 0 16

--


반응형
댓글
최근에 올라온 글
최근에 달린 댓글
링크
Total
Today
Yesterday