본문 바로가기
알고리즘 & 자료구조/백준

백준 2615

by 신재권 2021. 12. 13.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main2615 {
	
	static int[][] a; 
	static int cnt = 0, row=1, col = 1, dd = 1, ud = 1;
	//                   가로   세로      아래대각   위대각 
	
	 //위오, 오, 아오, 아 ->가장 왼쪽 바둑알을 찾는다.,세로는 가장 
	//6개 알이 연속적인 경우 그대로 진행
	
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		a = new int[20][20];
		
		for(int i=1; i<20; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			for(int j=1; j<20; j++) {
				a[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		
		for(int i=1; i<20; i++) {
			for(int j=1; j<20; j++) {
				if(a[i][j] == 1) { //검은돌일경우 
					search(i, j, 1);
				}else if(a[i][j] == 2) {
					search(i, j, 2);
				}
			}
		}
		//만약 위에서 종료가안되었으면 정답은 0
		System.out.println(0);
		

	}


	public static boolean check(int x, int y, int num) { //같은 돌인지 확인하는 함수
		if (valid(x, y)) { //만약 유효한 좌표이고
			if (a[x][y] != num) { // 돌이 같지 않다면 
				return false; // 같은 돌 X
			}
		} else {//만약 유효한 좌표가 아니라면 
			return false; 
		}
		//여기까지 정상적으로 왔으면 유효한 좌표이며, 같은 색의 돌이다.
		return true;
	}

	public static boolean valid(int x, int y) { //유효한 좌표인지 확인 
		if (x < 1 || x > 19 || y < 1 || y > 19) {
			return false;
		}
		return true;
	}

	public static void search(int i, int j, int num) { 
		
		// 가로 확인
		for (int k = 1; k < 5; k++) {
			if (!check(i, j + k, num)) { // 좌표를 가로로 늘리면서 검사
				break;
			}else { //맞으면 가로 길이 증가
				row++;
			}
		}

		// 세로 확인
		for (int k = 1; k < 5; k++) {
			if (!check(i + k, j, num)) { //좌표를 세로로 늘리면서 검사
				break;
			}
			else { //맞으면 세로 길이 증가
				col++;
			}
		}

		// 아래 대각선(오른쪽) down diagonal  확인
		for (int k = 1; k < 5; k++) {
			if (!check(i + k, j + k, num)) { //좌표를 대각선으로 늘리면서 검사
				break;
			}
			else { //맞으면 대각선 길이 증가
				dd++;
			}
		}

		// 위 대각선 (오른쪽) up diagonal 확인
		for (int k = 1; k < 5; k++) { 
			if (!check(i - k, j + k, num)) { //좌표를 대각선으로 늘리면서 검사
				break;
			}else {
				ud++;
			}
		}
		
		// 1. 돌이 한 방향으로 5개이면 
		// 2. 먼저 유효한 좌표 체크 
		// 2-1. 유효한 좌표이면 
		// 2-1-1. 같은 돌인지 검사 
		// 2-1-2. 반대쪽 돌도 유효한 좌표와, 같은 돌인지 검사
		// 2-2. 유효한 좌표가 아니라면
		// 2-2-1. 정답 출력

		// 양쪽 끝에 돌이 더있는지 확인 (6개 이상이면 인정이 안된다) 
		if (row == 5) { //돌이 5개 이면  
			if (valid(i, j - 1)) { //유효한 좌표인지 체크
				if (a[i][j - 1] != num) { //같은 돌이 아니라면 
					if (valid(i, j + 5)) { //반대쪽도 검사
						if (a[i][j + 5] != num) { //반대쪽도 같은 돌이 아니라면 
							print(i, j, num); //정답 출력 
						}
					} else { //반대쪽의 좌표가 유효한 좌표가 아니라면 
						print(i, j, num); //정답 출력
					}
				}
			} else { //유효한 좌표가 아니라면 
				if (valid(i, j + 5)) { //반대쪽 좌표도 체크 
					if (a[i][j + 5] != num) { //반대쪽 좌표가 같은 돌이 아니라면 
						print(i, j, num); //정답 
					}
				} else { //반대쪽 좌표가 유효한 좌표가 아니라면 
					print(i, j, num); //정답 
				}
			}

		}
		if (col == 5) {
			if (valid(i - 1, j)) {
				if (a[i - 1][j] != num) {
					if (valid(i + 5, j)) {
						if (a[i + 5][j] != num) {
							print(i, j, num);
						}
					} else {
						print(i, j, num);
					}
				}
			} else {
				if (valid(i + 5, j)) {
					if (a[i + 5][j] != num) {
						print(i, j, num);
					}
				} else {
					print(i, j, num);
				}
			}
		}
		if (dd == 5) {
			if (valid(i - 1, j - 1)) {
				if (a[i - 1][j - 1] != num) {
					if (valid(i + 5, j + 5)) {
						if (a[i + 5][j + 5] != num) {
							print(i, j, num);
						}
					} else {
						print(i, j, num);
					}	
				}
			} else {
				if (valid(i + 5, j + 5)) {
					if (a[i + 5][j + 5] != num) {
						print(i, j, num);
					}
				} else {
					print(i, j, num);
				}
			}
		}
		if (ud == 5) {
			if (valid(i + 1, j - 1)) {
				if (a[i + 1][j - 1] != num) {
					if (valid(i - 5, j + 5)) {
						if (a[i - 5][j + 5] != num) {
							print(i, j, num);
						}
					} else {
						print(i, j, num);
					}
				}
			} else {
				if (valid(i - 5, j + 5)) {
					if (a[i - 5][j + 5] != num) {
						print(i, j, num);
					}
				} else {
					print(i, j, num);
				}
			}
		}

		//위에서 정답을 찾지 못했으면 다시 1로 초기화해서 다시 찾는다.
		row = 1;
		col = 1;
		dd = 1;
		ud = 1;
	}

	public static void print(int i, int j, int num) {
		System.out.println(num);
		System.out.println(i + " " + j);
		System.exit(0); //찾으면 프로그램을 종료한다.
	}
}

'알고리즘 & 자료구조 > 백준' 카테고리의 다른 글

백준 4375  (0) 2021.12.15
백준 10211  (0) 2021.12.14
백준 1269  (0) 2021.12.12
백준 2491  (0) 2021.12.11
백준 2559  (0) 2021.12.10