티스토리 뷰
반응형
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
--
반응형
'PS > Problem_Solving' 카테고리의 다른 글
[SWEA] 1961. 숫자 배열 회전(JAVA) (0) | 2019.08.08 |
---|---|
[SWEA] 4613. 러시아 국기 같은 깃발(JAVA) (0) | 2019.07.25 |
[SWEA] 1204. 최빈수 구하기(JAVA) (0) | 2019.06.28 |
[SWEA] 2046. 스탬프 찍기(JAVA) (0) | 2019.05.27 |
[SWEA] 2047. 소문자를 대문자로 변환(JAVA) (0) | 2019.05.27 |
댓글