본문 바로가기

ALGORITHM

백준 2615 오목 (Java)

1. 문제 링크

 

2615번: 오목

오목은 바둑판에 검은 바둑알과 흰 바둑알을 교대로 놓아서 겨루는 게임이다. 바둑판에는 19개의 가로줄과 19개의 세로줄이 그려져 있는데 가로줄은 위에서부터 아래로 1번, 2번, ... ,19번의 번호

www.acmicpc.net

 

2. 문제 및 입출력예제

 

3. 문제 풀이

1. 바둑이 놓여져 있는 칸에서 팔방탐색을 통해 오목이 만들어지는지 확인한다.

2. 한 방향으로 5칸을 가면서 5칸까지만 같은 색인지 확인하고, 같은 색이면 PriorityQueue에 좌표를 넣는다.

3. 다섯 알 연속이 만들어졌으면 반대 방향 한 칸을 확인해 여섯 알 이상이 되는지 확인한다.

4. 오목이 만들어졌다면 PriorityQueue에서 정렬된 좌상단 위치를 저장한다.

 

4. 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.Queue;

public class Main {
	static class Point implements Comparable<Point>{
		int x;
		int y;
		public Point(int x, int y) {
			super();
			this.x = x;
			this.y = y;
		}
		@Override
		public int compareTo(Point o) {
			if(this.y == o.y) {
				return this.x - o.x;
			}
			return this.y - o.y;
		}
	}
	static char[][] map;
	static int resultX, resultY;
	static int[] dx = {0, 0, -1, 1, -1, -1, 1, 1}; //좌 우 상 하 좌상 우상 우하 좌하
	static int[] dy = {-1, 1, 0, 0, -1, 1, 1, -1}; 
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		map = new char[20][20];
		for(int i=0;i<19;i++) {
			String[] str = br.readLine().split(" ");
			for(int j=0;j<19;j++) {
				map[i+1][j+1] = str[j].charAt(0);
			}
		}
		
		//이긴 바둑알의 좌상단 가로, 세로 번호 출력
		boolean flag = false;
		out:
		for(int i=1;i<20;i++) {
			for(int j=1;j<20;j++) {
				if(map[i][j] !='0') {
					for(int d=0;d<8;d++) {
						if(check(i, j, d)) {
							flag = true;
							sb.append(map[i][j]+"\n"+resultX+" "+resultY);
							break out;
						}
					}
				}
			}
		}
		
		if(!flag) {
			System.out.println(0);
		}
		else {
			System.out.println(sb);
		}
		
	}
	
	private static boolean check(int i, int j, int d) {
		PriorityQueue<Point> queue = new PriorityQueue<>();
		int cnt = 1;
		boolean result = false;
		int base = map[i][j];
		queue.offer(new Point(i, j));
		int x = i;
		int y = j;
		for(int k=0;k<5;k++) {
			x += dx[d];
			y += dy[d];
			if(x<=0||x>19||y<=0||y>19) {
				break;
			}
			if(map[x][y] != base) {
				break;
			}
			cnt++;
			queue.offer(new Point(x, y));
		}
	
		if(cnt == 5) { //5개면 반대 방향 확인해서 6개인지 체크해야 함
			if(map[i+dx[d]*-1][j+dy[d]*-1] != map[i][j]){
				result = true;
				Point p = queue.poll();
				resultX = p.x;
				resultY = p.y;
			}
		}
		return result;
		
	}
}