티스토리 뷰

알고리즘

백준 2072

kOsari 2023. 6. 20. 05:02

2072번: 오목 (acmicpc.net)

 

2072번: 오목

19x19크기의 바둑판에, 돌을 놓을 좌표가 주어지면 이 게임이 몇 수만에 끝나는 지를 알아보려고 한다. 사용하고자 하는 바둑판의 모양은 위의 그림과 같으며, (1, 1)이 가장 왼쪽 위의 좌표이고 (19

www.acmicpc.net

문제 이해

해당 문제는 단순히 주어진 내용에 맞춰 알고리즘을 짜면 된다.

여기서 주의 할 것은 5개 이상이 아니라 5개 이어야만 문제가 해결이 된다.

 

풀이

8개 이하는 무조건 승부가 나지 않는다.

9개 부터는 승부가 낮는지 비교하면서 배열을 채우면 된다.

import java.util.Arrays;
import java.util.Scanner;

public class test30 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[][] arr = new int[20][20];
        int n = sc.nextInt();
        if (n < 9) {
            //9경기 부터는 승부가 날 수도 있다.
            System.out.println(-1);
        }

        //8번째 경기까지는 승부가 나지 않는다.
        //즉 그냥 넣어도 문제 없다.
        for (int i = 0; i < 8; i++) {
            int a = sc.nextInt();
            int b = sc.nextInt();
            //흑은 1 백은 2에 저장
            arr[a][b] = i%2 + 1;
        }

        //9번째 부터는 승부가 날 수 있으므로 승부가 났는지 체크하면서 추가한다.
        for (int i = 8; i < n; i++) {
            int a = sc.nextInt();
            int b = sc.nextInt();
            arr[a][b] = i%2 + 1;
            if (check(arr, a, b, i%2 + 1)) {
                System.out.println(i+1);
                return;
            }
        }
        
        //모든 걸 통과 못하면 그냥 -1 출력
        System.out.println(-1);
    }
    
    //8방향 체크
    private static final int[] row = {0, 0, -1, 1, -1, 1, -1, 1};
    private static final int[] col = {1, -1, 0, 0, -1, 1, 1, -1};
    
    //승부가 정해 졌는지 체크
    private static boolean check(int[][] arr, int r, int c, int color) {
        //대각선 부분은 동일 한 부분 즉 0은 오른 쪽 y=0 1은 왼쪽 y=0 즉 한줄이다.
        //즉 4개의 줄이 있다.
        int[] cnt = new int[4];
        Arrays.fill(cnt, 1);
        //현재 위치에서 8방향 체크
        //체크 방법은 현재 위치에서 8방향을 계산하면서 모든 map을 8방향 이동하면서 같은 색인지 count
        for (int d = 0; d < 8; d++) {
            for (int a = r+row[d], b = c+col[d]; a>=0 && a<arr.length && b>=0 && b<arr[0].length && arr[a][b] == color; a+=row[d], b+=col[d]) {
                cnt[d/2]++;
            }
        }
        for (int i = 0; i < 4; i++) {
            //무조건 5개, 5개 이상도 틀림
            if (cnt[i] == 5)
                return true;
        }
        return false;
    }
}

'알고리즘' 카테고리의 다른 글

백준 2089번  (0) 2023.06.21
백준 2075  (0) 2023.06.20
백준2004  (0) 2023.06.20
백준 1965  (0) 2023.06.20
백준 1927  (0) 2023.06.17
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함