본문 바로가기
Algorithm/Baekjoon

[백준] 15671: 오델로 - JAVA

Baspo8 2024. 8. 13.

https://www.acmicpc.net/problem/15671

 

풀이

익히 알고있던 오델로 게임을 시뮬레이션하는 문제였다.

 

예를 들어 BWWW 와 같은 줄이 있을 때 오른쪽 끝에 B를 위치한다면 BWWWB 처럼 검정 돌이 흰 돌을 감싸 잡아먹게된다. 둘러쌓인 흰 돌이 검정색으로 바뀌게 되고 BBBBB가 된다.

 

검정 돌부터 시작하여 돌을 놓는 좌표가 주어지는데, 돌을 놓을 때 대각선까지 팔방탐색하여 처음 검정 돌을 만나면 이전의 흰 돌들을 검정색으로 바꾸고, 빈칸을 만난다면 패스한다.

 

최종 보드판의 상태와 검정, 흰 돌중 어느 돌이 많아 승리하는지 구하면 된다.

 


 

메모리: 14304KB
시간: 104ms
언어: Java 11

import java.io.*;
import java.util.*;

public class Main {
    static char[][] board;
    static int[][] vector = { { 1, 0 }, { -1, 0 }, { 0, 1 }, { 0, -1 }, { 1, 1 }, { 1, -1 }, { -1, 1 }, { -1, -1 } };

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());

        int[][] logs = new int[n][2];
        StringTokenizer st;
        for (int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine());
            logs[i][0] = Integer.parseInt(st.nextToken());
            logs[i][1] = Integer.parseInt(st.nextToken());
        }

        board = new char[7][7];
        for (int i = 1; i < 7; i++) {
            for (int j = 1; j < 7; j++) {
                board[i][j] = '.';
            }
        }
        board[3][3] = 'W';
        board[4][4] = 'W';
        board[3][4] = 'B';
        board[4][3] = 'B';

        for (int i = 0; i < n; i++) {
            int r = logs[i][0];
            int c = logs[i][1];

            putStone(r, c, i);
        }

        int black = 0;
        int white = 0;
        for (int i = 1; i < 7; i++) {
            for (int j = 1; j < 7; j++) {
                System.out.print(board[i][j]);
                if (board[i][j] == 'B') {
                    black++;
                } else if (board[i][j] == 'W') {
                    white++;
                }
            }
            System.out.println();
        }

        System.out.println(black > white ? "Black" : "White");
    }

    private static void putStone(int r, int c, int turn) {
        if (turn % 2 == 0) {
            board[r][c] = 'B';
        } else {
            board[r][c] = 'W';
        }

        loop: for (int k = 0; k < 8; k++) {
            ArrayList<int[]> toBeChanged = new ArrayList<>();
            int nr = r;
            int nc = c;
            while (true) {
                nr += vector[k][0];
                nc += vector[k][1];

                if (nr < 1 || nc < 1 || nr > 6 || nc > 6) {
                    continue loop;
                }

                if (board[nr][nc] == board[r][c]) {
                    break;
                } else if (board[nr][nc] == '.') {
                    continue loop;
                } else {
                    toBeChanged.add(new int[] { nr, nc });
                }
            }

            for (int[] spot : toBeChanged) {
                board[spot[0]][spot[1]] = board[r][c];
            }
        }
    }

}