백준 15671 - 오델로
Updated:
Java
15671 번 - 오델로
문제
- 흑, 백돌이 번갈아 가면서 돌을 놓는다.
- n 번의 로그에 따른 돌을 놓은 후 그에 따른 결과와 승리자를 뽑는다.
접근 방법
- n개의 로그 대로 흑,백을 번갈아 가면서 돌을 놓는다.
- 놓은 자리에서 8방향 [좌상, 상, 우상, 좌, 우하 , 하, 좌하, 우]로 탐색을 한다.
- 상대방 돌을 찾으면, 그 방향으로 계속 탐색하여 상대방 돌이 끝나는 지점까지 탐색하고, 그 횟수를 기록한다.
- 만약 마지막 돌이 현재 자신의 색이면 다시 역방향으로 횟수 만큼 돌아가며 돌의 색을 바꾼다.
방향인 [좌상, 상, 우상, 좌, 우하 , 하, 좌하, 우]은 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);
}
}
총평
난이도
⭐⭐★★★
후기
간단한 구현 문제였다.
개선할 점
없