본문 바로가기
알고리즘문제풀이

[JAVA] SWEA 4615 재미있는 오셀로게임

by Hindsight.. 2020. 8. 21.

전체 코드

import java.util.Scanner;

public class SWEA_4615_재미없는오셀로게임 {

	static int T, N, M;

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		T = sc.nextInt();
		int[][] arr;
		int y, x, col, ry, rx, ry2, rx2, w, b;
		int[] dy = { -1, -1, +1, +1, 0, 0, 1, -1 }; //
		int[] dx = { -1, +1, +1, -1, 1, -1, 0, 0 };
		for (int test = 1; test <= T; test++) {
			w = 0;
			b = 0;
			N = sc.nextInt();
			M = sc.nextInt();
			arr = new int[N][N];

			arr[N / 2 - 1][N / 2 - 1] = 2; // 초기 설정
			arr[N / 2][N / 2] = 2;
			arr[N / 2 - 1][N / 2] = 1;
			arr[N / 2][N / 2 - 1] = 1;

			for (int q = 0; q < M; q++) {
				y = sc.nextInt() - 1;
				x = sc.nextInt() - 1;
				col = sc.nextInt();

				arr[y][x] = col; // 놓을 위치
				for (int i = 0; i < 4; i++) {
					ry = y;
					rx = x;
					for (int j = 0; j < N; j++) { 
						ry += dy[i];
						rx += dx[i];
						if (ry >= 0 && ry < N && rx >= 0 && rx < N) { // 범위 체크
							if (arr[ry][rx] == 0)
								break;
							if (arr[ry][rx] == arr[y][x]) { // 처음 위치와 순회중 위치가 같을 때
								for (int z = j; z >= 0; z--) {
									ry -= dy[i];
									rx -= dx[i];
									arr[ry][rx] = col; // 모두 같은색으로 바뀐다.
								}
								break;
							}
						} else
							break;
					}

				}
			}

			for (int i = 0; i < N; i++) { // 개수 체크
				for (int j = 0; j < N; j++) {
					if (arr[i][j] == 1)
						b++;
					else if(arr[i][j] == 2)
						w++;
				}
			}

			System.out.println(String.format("#%d %d %d", test, b, w));

		}

	}
}

 

문제 핵심

그저 오슬로 게임 방식의 흐름대로 따라가며 구현했다.

단 하나 신경써야 할 것은 개수를 셀때 if 와 else로 구현하면 안된다는 부분을 주의해야 한다.

흰색과 검정 그리고 아무것도 없는 경우도 고려해야 하기 때문이다.

 

오슬로를 많이 해보지 않아 게임의 규칙을 정확히 몰랐었고, 흰색과 검정색으로 채워지지 않는 경우를 고려하지 못했다.

따라서 if else if로 정확히 흰색과 검정색의 개수를 세야 한다는 것을 명심하자!