백준 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);
    }
}

총평

후기

조건이 많아 귀찮은 문제.

개선할 점