728x90

https://www.acmicpc.net/problem/2615

 

2615번: 오목

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

www.acmicpc.net

 

 

문제)

 

 

풀이)

파악해야 하는 것

 

1. 어떻게 연속된 바둑알을 찾아낼 것인가

2. 6개 이상 연속된 바둑알을 어떻게 찾아낼 것인가

 

 

 

1. 연속된 바둑알 찾아내기

 

좌측 상단부터 바둑알을 찾아낼 것이기 때문에 8방향을 모두 살펴볼 필요 없이,

하, 우, 우상, 우하 방향만 보면 된다.

 

그리고 연속된 5개의 바둑알을 찾기 위해 다음 좌표를 같은 방향으로 반복문을 돌려준다.

 

 

2. 6개의 연속된 바둑알 찾아내기

 

6개의 연속된 바둑알은 두 가지로 생각했다.

 

1) 바라보는 방향에서 연속된 6개의 바둑알

2) 바라보는 방향에서 연속된 5개의 바둑알

+ 기준점에서 반대 방향으로 같은 색의 바둑알 존재

 

1)을 해결하기 위해,

 

for문을 5번 돌려 count 값이 5인지 6인지 확인한다.

6일 경우, 연속된 돌이 6개 있다는 것!

 

 

2)를 해결하기 위해,

count값이 5일 때, 기준점에 있던 돌의 반대편에 다른 돌이 있는지 체크한다.

 

이때, 반대편 돌이 map 범위 내에 없다면 5개가 확정!!

 

map 범위 내에 있다면 같은 색인지 아닌지 체크하면 된다.

만약, 같은 색이라면 연속된 돌이 6개 있다는 것!

 

 

코드)

import java.util.Scanner;

public class Main_BJ_2615_오목 {

	public static void main(String[] args) throws Exception{
		//System.setIn(new FileInputStream("Test5.txt"));
		Scanner sc = new Scanner(System.in);
		
        // input 받아오기
		int[][] map = new int[19][19];
		for(int i=0; i<19; i++) {
			for(int j=0; j<19; j++) {
				map[i][j] = sc.nextInt();
			}
		}
        
		// 하 우 우상 우하
		int[] dx = {1, 0, -1, 1};
		int[] dy = {0, 1, 1, 1}; 
		for (int i=0; i<19; i++) {
			for(int j=0; j<19; j++) {
            	// 바둑알 존재 여부
				if(map[i][j] == 1 || map[i][j] == 2) {
					int nx=i;
					int ny=j;
					for(int k=0; k<dx.length; k++) {
                    	// 다음 좌표 초기화 및 바둑알 개수 초기화
						int count=1;
						nx=i;
						ny=j;
                        
                        // 연속되게 바둑알이 있는지 확인
                        // 5번을 탐색하여 기준 돌로부터 그 방향에 돌 5개인지 6개인지 판단
						for(int c=0; c<5; c++) {
							nx = nx+dx[k];
							ny = ny+dy[k];
							
							if(0<=nx && nx<19 && 0<=ny && ny<19) {
								if(map[nx][ny] == map[i][j])
									count+=1;
								else
									break;
							}
							else
								break;
						}
						if (count == 5) {
                        	// 5개의 돌이 있는지 확인 후, 기준점의 반대편에 돌이 있는경우 확인	
							if(i-dx[k]>=0 && j-dy[k]>=0 && i-dx[k]<19 && j-dy[k]<19) {
                            	//돌이 map 내에 존재, 기준 바둑알과 일치하면 6개가 됨
								if(map[i-dx[k]][j-dy[k]]==map[i][j]) 
									continue;
                                //돌이 map 내에 존재, 기존 바둑알과 일치하지 않으면 5개가 됨
								else {
									System.out.println(map[i][j]);
									System.out.println((i+1)+ " " +(j+1));
									System.exit(0);
								}									
							}
                            
                           //이전 돌이 map 내애 존재하지 않는다면 연속된 돌 5개 확정.
							else {
								System.out.println(map[i][j]);
								System.out.println((i+1)+ " " +(j+1));
								System.exit(0);
							}
						}
						// 바둑알 6개 존재(기준점보다 앞에 존재) 혹은 5개 미만	
						else
							continue;
							
					}
				}
			}
		}
    // 승부가 나지 않았을 때
	System.out.println(0);
	}

}

 

728x90

+ Recent posts