알고리즘

[백준] 2615 오목 - java

minkang 2021. 6. 29. 16:44

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

 

2615번: 오목

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

www.acmicpc.net

public class 오목 {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int board[][] = new int[20][20];
        boolean visit[][][] = new boolean[20][20][4];
        
		for(int i=1; i<=19; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			for(int j=1; j<=19; j++){
                board[i][j] = Integer.parseInt(st.nextToken());
            }
		}
        
        for(int i=1; i<=19; i++){
            for(int j=1; j<=19; j++){
                if(board[i][j] != 0){
                    int result = omokCheck(i, j, board, visit);
                    if(result == 0 || result == 1 || result == 2){
                        System.out.println(board[i][j]);
                        System.out.println((i) + " " + (j));
                        return;
                    }
                    else if(result == 3){
                        System.out.println(board[i][j]);
                        System.out.println((i+4) + " " + (j-4));
                        return;
                    }
                }
            }
        }
        System.out.println(0);
	}
    
    private static int omokCheck(int r,int c, int board[][], boolean visit[][][]){
        int dir[][] = {{0,1},{1,0},{1,1},{1,-1}};
        for(int d=0; d<4; d++){
            if(visit[r][c][d] == false){
                boolean flag = false;
                visit[r][c][d] = true;
                int nr = r;
                int nc = c;
                int cnt = 1;
                while(true){
                    nr += dir[d][0];
                    nc += dir[d][1];
                    if(isBound(nr, nc) && board[nr][nc] == board[r][c]){
                        visit[nr][nc][d] = true;
                        cnt++;
                        continue;
                    }
                    break;
                }
                if(cnt == 5)
                    return d;
            }
        }
        
        return -1;
    }   
       
    private static boolean isBound(int r, int c){
        if(r <=0 || r> 19 || c <=0 || c>19 ){
            return false;
        }
        return true;
    }
}

1. 오목의 위치를 나타내는 board[][], 방문처리를 할 visit[][][4]를 선언합니다.

visit을 3차원 배열로 선언한 것은 가로, 세로, 대각선 오른쪽아래, 대각선 왼쪽아래에 대해서 따로 처리를 해야되기 때문입니다.

2. 왼쪽위부터 순회하면서 오목이 있으면 4가지 방향에 대해서 체크를 합니다.

3. 육목을 체크해야돼서 cnt를 주었고 해당 방향의 놓여있는 오목 전부 방문합니다.

4. 오목이면 해당 방향 값을 리턴하고 각 방향에 따라 가장 왼쪽에 위치한 오목을 출력합니다.