백준 2615번 : 오목 | 자바 풀이

박지윤·2022년 7월 16일
0

Algorithm_Implementation

목록 보기
5/16

[ Solution ]

package implement2615;

import java.io.*;
import java.util.*;

public class Main {
    static int[][] arr = new int[19][19];
    static int[] dr = {-1, 0, 1, 1, 1, 0, -1, -1}; // 0-3번째는 조건 방향, 4-7번째는 조건 외 방향
    static int[] dc = {1, 1, 1, 0, -1, -1, -1, 0}; // 0-3번째는 조건 방향, 4-7번째는 조건 외 방향
    static int count = 0; // 바둑알 세는 변수

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        int success = 0; // 오목 성공 여부 판별 변수

        for(int i = 0; i < 19; i++) {
            st = new StringTokenizer(br.readLine(), " ");
            for(int j = 0; j < 19; j++) {
                arr[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        logicfor: for(int i = 0; i < 19; i++) {
            for(int j = 0; j < 19; j++) {
                if(arr[i][j] == 1 || arr[i][j] == 2) {
                    for(int k = 0; k < 4; k++) { // 방향 지정
                        count = 1; // arr[i][j] 하나 먹고 시작
                        if(check(k, arr[i][j], i, j) == 5 && !checkPrev(k+4, arr[i][j], i, j)){ //같은 바둑 알이 5개 이고, 6개 이상이 아닌지 판별
                            System.out.printf("%d\n%d %d", arr[i][j], i+1, j+1);
                            success = 1; // 성공으로 바꿔주기
                            break logicfor;
                        }

                    }
                }
            }
        }

        //실패 했을 때
        if(success != 1){
            System.out.println(0);
        }
    }

	// 6개 이상인지 아닌지 판별
    static boolean checkPrev(int k, int player, int i, int j) {
        return 0<=i+dr[k] && i+dr[k]<19 && 0<=j+dc[k] && j+dc[k]<19 && arr[i+dr[k]][j+dc[k]] == player;
    }
	
    // 같은 바둑알이 5개인지 판별
    static int check(int k, int player, int i, int j) {
        if(k == 0) {
            if(0<=i+dr[k] && i+dr[k]<19 && 0<=j+dc[k] && j+dc[k]<19 && arr[i+dr[k]][j+dc[k]] == player) {
                count++; // 바둑알 증가
                check(k, player, i+dr[k], j+dc[k]); // 같은 방향의 다음 바둑알에 대해서도 판별
            }
            else {
                return count;
            }
        }

        else if(k == 1) {
            if(0<=i+dr[k] && i+dr[k]<19 && 0<=j+dc[k] && j+dc[k]<19 && arr[i+dr[k]][j+dc[k]] == player) {
                count++;
                check(k, player, i+dr[k], j+dc[k]);
            }
            else {
                return count;
            }
        }

        else if(k == 2) {
            if(0<=i+dr[k] && i+dr[k]<19 && 0<=j+dc[k] && j+dc[k]<19 && arr[i+dr[k]][j+dc[k]] == player) {
                count++;
                check(k, player, i+dr[k], j+dc[k]);
            }
            else {
                return count;
            }
        }

        else if(k == 3) {
            if(0<=i+dr[k] && i+dr[k]<19 && 0<=j+dc[k] && j+dc[k]<19 && arr[i+dr[k]][j+dc[k]] == player) {
                count++;
                check(k, player, i+dr[k], j+dc[k]);
            }
            else {
                return count;
            }
        }

        return count;

    }
}

평소에 오목도 좋아해서,, ㅎㅎ 재미있게 풀었던 문제이다.
문제에서 중요한 조건이 있는데 '알이 여섯알 이상 놓였을 경우 이긴 것이 아니다'라는 것이다.
그래서 그 조건에 대해서도 고려하기 위해서는 한 방향에 대해서 같은 색깔의 오목 알이 5개가 있는지 체크하고, 바로 반대방향에 대해서 같은 색깔의 오목 알이 없는지 체크해야 해야 한다.

방향을 인덱스 값으로 잘 표현하는 것이 이 문제의 핵심이라고 생각한다.

0개의 댓글