코딍코딍
코딩기록
코딍코딍
전체 방문자
오늘
어제
  • 분류 전체보기 (271)
    • 개발 (2)
    • Java (1)
    • 스프링 (28)
    • JPA (11)
    • Git (3)
    • 알고리즘 (160)
      • 백준 (132)
      • 프로그래머스 (8)
      • SWEA (20)
    • 토이 프로젝트 (14)
      • 간단한 Springboot CRUD (1)
      • 게시판 프로젝트 (13)
    • 알고리즘 개념정리 (8)
    • 오류 해결 (13)
    • 보류 (0)
    • AWS (5)
    • 트러블 슈팅 (0)
    • 회고 (3)
    • CS (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

최근 글

티스토리

hELLO · Designed By 정상우.
코딍코딍

코딩기록

알고리즘/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. 모든 칸을 대상으로 돌이 가로, 세로, 대각선 중 하나의 방향으로 다섯 개 이상 연속한 부분이 있는지 판단한다.

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

[SWEA] 4615번 : 재미있는 오셀로 게임  (0) 2023.11.05
[SWEA] 8016번 : 홀수 피라미드  (0) 2023.11.03
[SWEA] 1860번 : 진기의 최고급 붕어빵  (0) 2023.11.02
[SWEA] 9658번 : 유효숫자 표기  (1) 2023.11.02
[SWEA] 16910번 : 원 안의 점  (0) 2023.10.26
    '알고리즘/SWEA' 카테고리의 다른 글
    • [SWEA] 4615번 : 재미있는 오셀로 게임
    • [SWEA] 8016번 : 홀수 피라미드
    • [SWEA] 1860번 : 진기의 최고급 붕어빵
    • [SWEA] 9658번 : 유효숫자 표기
    코딍코딍
    코딍코딍
    ㅎ2

    티스토리툴바