백준 15671 - 오델로

Updated:

Java

15671 번 - 오델로

문제

  1. 흑, 백돌이 번갈아 가면서 돌을 놓는다.
  2. n 번의 로그에 따른 돌을 놓은 후 그에 따른 결과와 승리자를 뽑는다.

접근 방법

  1. n개의 로그 대로 흑,백을 번갈아 가면서 돌을 놓는다.
  2. 놓은 자리에서 8방향 [좌상, 상, 우상, 좌, 우하 , 하, 좌하, 우]로 탐색을 한다.
  3. 상대방 돌을 찾으면, 그 방향으로 계속 탐색하여 상대방 돌이 끝나는 지점까지 탐색하고, 그 횟수를 기록한다.
  4. 만약 마지막 돌이 현재 자신의 색이면 다시 역방향으로 횟수 만큼 돌아가며 돌의 색을 바꾼다.
    방향인 [좌상, 상, 우상, 좌, 우하 , 하, 좌하, 우]은 4를 기준으로 서로 반대 방향을 뜻하므로 (k + 4) % 8를 통하여 방향을 나타낸다.

코드

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

public class Main {
	// 좌상, 상, 우상, 좌, 우하 , 하, 좌하, 우 
	// 0  , 1,   2, 3,   4,  5,  6,  7
    static int[] dy = {-1, -1, -1, 0, 1, 1, 1, 0};
    static int[] dx = {-1, 0, 1, -1, 1, 0, -1, 1};

	static int n, result, size = 6;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	StringTokenizer stk;
    	n = stoi(br.readLine());
    	
    	char[][] board = new char[size][size];
    	
    	for(int i = 0; i < 6; i++) {
    		for(int j = 0; j < 6; j++) {
    			board[i][j] = '.';
    		}
    	}
    	board[2][2] = 'W';
    	board[3][3] = 'W';
    	board[2][3] = 'B';
    	board[3][2] = 'B';
    	int y, x, ny, nx, find;
    	int turn = 0;		// 0이 검은 돌, 1이 하얀 돌 / 처음은 검은 돌 부터 시작한다
    	char[] color = {'B', 'W'};
    	for(int i = 0; i < n; i++) {
    		stk = new StringTokenizer(br.readLine());
    		y = stoi(stk.nextToken()) - 1;
    		x = stoi(stk.nextToken()) - 1;
    		board[y][x] = color[turn];
    		
    		// 좌상, 상, 우상, 좌, 우하 , 하, 좌하, 우 
    		for(int k = 0; k < 8; k++){
    			ny = y + dy[k];
    			nx = x + dx[k];
    			find = 0;
    			// 현재 돌의 8방향으로 탐색하여, 현재 돌과 다른 색이면
    			while(isIn(ny, nx, size) && board[ny][nx] == color[(turn + 1) % 2]){
                    ny += dy[k];
                    nx += dx[k];
                    find++;
                }
    			// 마지막 돌이 현재 해당하는 색의 돌이면 뒤집을 수 있으므로 뒤집는다.
    			if(find != 0 && isIn(ny, nx, size) && board[ny][nx] == color[turn]) {
    				while(find > 0){
    					// 인덱스를 통하여 정 반대의 방향으로 탐색한다.
    					ny += dy[(k + 4) % 8];
                        nx += dx[(k + 4) % 8];
                        board[ny][nx] = color[turn];
    					find--;
    				}
    			}

    		}
    		// 턴을 바꾼다
    		if(turn == 0)
    			turn = 1;
    		else
    			turn = 0;
    	}
    	int white = 0, black = 0;
    	for(char[] cArr : board) {
    		for(char c : cArr) {
    			System.out.print(c);
    			if(c == 'W')
    				white++;
    			else if(c == 'B')
    				black++;
    		}
    		System.out.println();
    	}
    	if(white > black)
    		System.out.println("White");
    	else if(white < black)
    		System.out.println("Black");

    	br.close();
	}

	public static boolean isIn(int y, int x, int n){
        if(y < 0 || y == n || x < 0 || x == n)
            return false;
        return true;
    }

	static int stoi(String str) {
    	return Integer.parseInt(str);
    }
}

총평

난이도

⭐⭐★★★

후기

간단한 구현 문제였다.

개선할 점