[JAVA] 백준 2615 - 오목

백준 2615
정올 1733

문제 이해

오목인 바둑알 색깔을 찾으면 된다. 무승부 없고, 한 색깔이 여러번 오목인 것도 없다.

주의할 점은 육목 안됨 & 인덱스


문제 풀이

y=x 방향, y=0 방향, y=-x방향, x=0 방향으로 오목인지 탐색하면 된다.

인덱스를 정말 ! 주의해야 한다 !!
(인덱스 잘못 설정해서 백준 채점이 자꾸 틀렸다고 떴다. 정올으로 넘어가서 채점하니까 어떤 테스트케이스에서 틀렸는지 알려준 덕분에 쉽게 찾을 수 있었다.)

  1. 바둑알이 있을 때만 오목인지 확인
  2. 해당 위치에서 4개의 방향을 탐색하며 오목인지 확인
  3. 총 5번 인덱스가 넘어가지 않고, 색깔이 같으면 오목 후보
  4. 육목인지 체크 : 오목의 양 옆 체크 (인덱스 넘어가지 않고, 색깔이 다르면 오목 확정)
  5. 오목 확정되면 print 하고 전체 for문 종료

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

	static int[] dx = {1,1,1,0};
	static int[] dy = {-1,0,1,1};
	
	public static void main(String[] args) throws IOException {
		char[][] baduk = new char[19][19];

		//입력받기
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		for (int i = 0; i < 19; i++) {
			baduk[i] = br.readLine().replace(" ", "").toCharArray();
		}
		
		int win = 0;
		
		ite : for (int i = 0; i < 19; i++) {
			for (int j = 0; j < 19; j++) {
				if(baduk[i][j] == '0') continue;
				
				for(int k = 0; k < 4; k++) { //4방 탐색
					int count = 0;
					
					for(int b=0;b<5;b++) { //오목 체크
						int X = i + dy[k]*b;
						int Y = j + dx[k]*b;
						if(X < 0 || Y < 0 || X >=19 || Y >=19) break; //인덱스 넘어가면 break
						if(baduk[i][j] != baduk[X][Y]) break; //색깔 다르면 break
						count++;
						
						if(count == 5) { //오목이면
							X = i - dy[k]; //육목인지 체크
							Y = j - dx[k];
							if(X >= 0 && Y >= 0 && X < 19 && Y < 19) {
								if(baduk[i][j] == baduk[X][Y]) break;								
							}
							
							X = i + dy[k]*5; //육목인지 체크
							Y = j + dx[k]*5;
							if(X >= 0 && Y >= 0 && X < 19 && Y < 19) {
								if(baduk[i][j] == baduk[X][Y]) break;
							}
							win = baduk[i][j] - '0'; //육목 아니면 print 후 종료
							System.out.println(win);
							System.out.println((i+1) + " " + (j+1));
							break ite;
						}
						
					}
				}
			}
		}
		if(win == 0) System.out.println(win);
		br.close();
		
	}
}

좋은 웹페이지 즐겨찾기