알고리즘/SWEA

[SWEA] 11315번 : 오목 판정

코딍코딍 2023. 11. 3. 14:00

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AXaSUPYqPYMDFASQ

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

문제

N X N 크기의 판이 있다판의 칸에는 돌이 있거나 없을 있다돌이 가로세로대각선 하나의 방향으로 다섯 이상 연속한 부분이 있는지 없는지 판정하는 프로그램을 작성하라.

 

입력

첫 번째 줄에 테스트 케이스의 수 T가 주어진다.

각 테스트 케이스의 첫 번째 줄에는 하나의 정수 N(5 ≤ N ≤ 20)이 주어진다.

다음 N개의 줄의 줄에는 길이 N 문자열이 주어진다 문자는 ‘o’또는 ‘.’으로, ‘o’ 돌이 있는 칸을 의미하고, ‘.’ 돌이 없는 칸을 의미한다.

 

출력

테스트 케이스 마다 돌이 다섯 이상 연속한 부분이 있으면 “YES”아니면 “NO” 출력한다.

 


소스코드

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

class Solution {
    static char arr[][];
    static int n;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        StringBuilder sb = new StringBuilder();
        int t = Integer.parseInt(br.readLine());

        for (int i = 0; i < t; i++) {
            n = Integer.parseInt(br.readLine());
            arr = new char[n][n];

            for (int j = 0; j < n; j++) {
                String str = br.readLine();
                for (int k = 0; k < n; k++) {
                    arr[j][k] = str.charAt(k);
                }
            }

            String result = "NO";
            boolean flag = false;
            for (int j = 0; j < n; j++) {
                for (int k = 0; k < n; k++) {
                    if(arr[j][k] == 'o'){
                        if(right(j, k) || under(j, k) || diagonal1(j, k) || diagonal2(j, k)) {
                            result = "YES";
                            flag = true;
                            break;
                        }
                    }
                }
                if(flag) break;
            }

            sb.append("#" + (i + 1) + " " + result + "\n");
        }

        System.out.println(sb);
    }

    static boolean right(int x, int y) {
        for (int i = 0; i < 5; i++) {
            if ((y + i) >= n || arr[x][y + i] == '.') {
                return false;
            }
        }
        return true;
    }

    static boolean under(int x, int y) {
        for (int i = 0; i < 5; i++) {
            if ((x + i) >= n || arr[x + i][y] == '.') {
                return false;
            }
        }
        return true;
    }

    static boolean diagonal1(int x, int y) {
        for (int i = 0; i < 5; i++) {
            if ((x + i) >= n || (y + i) >= n || arr[x + i][y + i] == '.') {
                return false;
            }
        }
        return true;
    }

    static boolean diagonal2(int x, int y) {
        for (int i = 0; i < 5; i++) {
            if ((x + i) >= n || (y - i) < 0 || arr[x + i][y - i] == '.') {
                return false;
            }
        }
        return true;
    }
}

 

해결 방법

  1. 모든 칸을 대상으로 돌이 가로세로대각선 하나의 방향으로 다섯 이상 연속한 부분이 있는지 판단한다.