백준 2615 - 오목
Updated:
Java
2615 번 - 오목
문제
접근 방법
오목의 이기는 경우는 세로 |
, 가로 ㅡ
, 대각선 /
, 대각선 \
이므로,
각각 경우의 수를 파악한다.
문제 조건에 6개 이상의 경우는 승리할 수 없으므로, 5개가 완성 된 다음 전, 후로 한번 더 확인하는 과정을 거치도록 한다.
코드
import java.util.*;
import java.io.*;
public class Main {
static int n, result;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stk;
n = 19;
int[][] board = new int[n][n];
StringBuilder sb = new StringBuilder();
for(int i = 0; i < n; i++) {
stk = new StringTokenizer(br.readLine());
for(int j = 0; j < n; j++) {
board[i][j] = stoi(stk.nextToken());
}
}
// 가로 탐색 -
// 1은 흑, 2는 백, 3은 처음
int color = 3 , cnt = 0;
for(int i = 0; i < n; i++) {
color = 0;
cnt = 0;
for(int j = 0; j < n; j++) {
// 빈공간을 만났을 때
if(board[i][j] == 0) {
cnt = 0;
color = 0;
continue;
}
// 흑돌
if(board[i][j] == 1) {
// 이전에 만난 돌이 계속 흑이면
if(color == board[i][j])
cnt++;
else
cnt = 1;
color = 1;
}
else if(board[i][j] == 2) {
if(color == board[i][j])
cnt++;
else
cnt = 1;
color = 2;
}
if(cnt == 5) {
if(j != 18 && board[i][j + 1] == color) {
continue;
}
sb.append(color).append("\n").append(i + 1).append(" ").append(j - 4 + 1);
System.out.println(sb.toString());
return;
}
}
}
// 세로 탐색 |
// 1은 흑, 2는 백, 3은 처음
for(int i = 0; i < n; i++) {
color = 0;
cnt = 0;
for(int j = 0; j < n; j++) {
// 빈공간을 만났을 때
if(board[j][i] == 0) {
cnt = 0;
color = 0;
continue;
}
// 흑돌
if(board[j][i] == 1) {
// 이전에 만난 돌이 계속 흑이면
if(color == board[j][i])
cnt++;
else
cnt = 1;
color = 1;
}
else if(board[j][i] == 2) {
if(color == board[j][i])
cnt++;
else
cnt = 1;
color = 2;
}
if(cnt == 5) {
if(j != 18 && board[j + 1][i] == color) {
continue;
}
sb.append(color).append("\n").append(j - 4 + 1).append(" ").append(i + 1);
System.out.println(sb.toString());
return;
}
}
}
// 대각선 \ 방향
// 1은 흑, 2는 백, 3은 처음
for(int i = 0; i < n - 4; i++) {
next : for(int j = 0; j < n - 4; j++) {
color = board[i][j];
if(color == 0)
continue;
for(int k = 0; k < 5; k++) {
if(board[i + k][j + k] != color)
continue next;
}
if(j != n - 5 && i != n - 5 && board[i + 5][j + 5] == color) {
continue;
}
if(j != 0 && i != 0 && board[i - 1][j - 1] == color) {
continue;
}
sb.append(color).append("\n").append(i + 1).append(" ").append(j + 1);
System.out.println(sb.toString());
return;
}
}
// 대각선 / 방향
// 1은 흑, 2는 백, 3은 처음
for(int i = 4; i < n; i++) {
next : for(int j = 0; j < n - 4; j++) {
color = board[i][j];
if(color == 0)
continue;
for(int k = 0; k < 5; k++) {
if(board[i - k][j + k] != color)
continue next;
}
if(i != 4 && j != 14 && board[i - 5][j + 5] == color) {
continue;
}
if(i != 18 && j != 0 && board[i + 1][j - 1] == color) {
continue;
}
sb.append(color).append("\n").append(i + 1).append(" ").append(j + 1);
System.out.println(sb.toString());
return;
}
}
// 승부가 결정나지 않을 때
System.out.println(0);
br.close();
}
static int stoi(String str) {
return Integer.parseInt(str);
}
}
총평
후기
조건이 많아 귀찮은 문제.