상세 컨텐츠

본문 제목

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

💯ProblemSolving/문제 풀이

by :Eundms 2024. 10. 31. 11:44

본문

       문제 요약        

- 문제

흑, 백 플레이어가 돌을 놓는데

사이에 있는 돌의 색이 변함

 

 

         아이디어        

 

1) 초기값 : 중앙에 돌 놓기 (1-N으로 주어졌지만 0-N-1으로 사용할것이기에)

2) 나와 같은 색이 있는지 확인하고 그 사이에 있는 다른 색의 "모든 돌"을 뒤집을 준비 

         소스코드        

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class Solution {

	static int T; // tc 개수
	static int N, M; // 보드의 한 변의 길이, 플레이어가 돌을 놓는 횟수
	static int[][] box;
	static int[][] way = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 }, { -1, -1 }, { -1, 1 }, { 1, -1 }, { 1, 1 } };

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		T = Integer.parseInt(br.readLine());
		for (int test = 1; test <= T; test++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			N = Integer.parseInt(st.nextToken());
			M = Integer.parseInt(st.nextToken());

			box = new int[N][N];
			box[N / 2 - 1][N / 2 - 1] = 2; // W
			box[N / 2 - 1][N / 2 + 1 - 1] = 1; // B
			box[N / 2 + 1 - 1][N / 2 + 1 - 1] = 2; // W
			box[N / 2 + 1 - 1][N / 2 - 1] = 1; // B
			for (int m = 0; m < M; m++) {

				st = new StringTokenizer(br.readLine());
				int x = Integer.parseInt(st.nextToken()) - 1;
				int y = Integer.parseInt(st.nextToken()) - 1;
				int value = Integer.parseInt(st.nextToken());

				box[x][y] = value;

				for (int w = 0; w < 8; w++) {

					List<int[]> rItems = new ArrayList<>();
					int a = x, b = y;
					while (true) {
						int nx = a + way[w][0];
						int ny = b + way[w][1];

						if (nx < 0 || nx >= N || ny < 0 || ny >= N) {
							break;
						}
						if (box[nx][ny] == 0) {
							break;
						} else if (box[nx][ny] == value) {
							reverse(rItems, value);
							break;
						} else {
							rItems.add(new int[] { nx, ny });
						}
						a = nx;
						b = ny;
					}
				}

			}
			int white = 0;
			int black = 0;
			for (int i = 0; i < N; i++) {
				for (int j = 0; j < N; j++) {
					white += box[i][j] == 2 ? 1 : 0;
					black += box[i][j] == 1 ? 1 : 0;
				}
			}
			System.out.println("#" + test + " " + black + " " + white);
		}
	}

	static void reverse(List<int[]> rItems, int value) {
		for (int i = 0; i < rItems.size(); i++) {
			int[] item = rItems.get(i);
			box[item[0]][item[1]] = value;
		}
	}

}

 

728x90

관련글 더보기

댓글 영역