코딩테스트/SWExpertAcademy

오목 판정 Python(SW Expert Academy, SWEA)

멍토 2021. 2. 23.

난이도 : D3

문제번호 : 11315

문제 주소 및 출처입니다.

swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AXaSUPYqPYMDFASQ&categoryId=AXaSUPYqPYMDFASQ&categoryType=CODE&problemTitle=%EC%98%A4%EB%AA%A9&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1

 

SW Expert Academy

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

swexpertacademy.com


목차

1. 문제 설명

2. 문제 해석

3. 소스 코드


1. 문제 설명

N X N 크기의 판이 있다. 판의 각 칸에는 돌이 있거나 없을 수 있다. 

돌이 가로, 세로, 대각선 중 하나의 방향으로 다섯 개 이상 연속한 부분이 있는지 없는지 판정하는 프로그램을 작성하라.

입력

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

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

다음 N개의 줄의 각 줄에는 길이 N인 문자열이 주어진다. 

각 문자는 ‘o’또는 ‘.’으로, ‘o’는 돌이 있는 칸을 의미하고, ‘.’는 돌이 없는 칸을 의미한다.

출력

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

예시

입력 출력
4
5
....o
...o.
..o..
.o...
o....
5
...o.
ooooo
...o.
...o.
.....
5
.o.oo
oo.oo
.oo..
.o...
.o...
5
.o.o.
o.o.o
.o.o.
o.o.o
.o.o.
#1 YES
#2 YES
#3 YES
#4 NO

2. 문제풀이

2차원 배열을 잘 다룰 수 있는지 물어보는 문제입니다.

2차원 배열을 돌면서 특정방향들을 검사하는데 연속으로 5개의 돌이 놓여있는지 체크하면 됩니다.

저의 풀이를 보면 아래와 같습니다.

1. 데이터 입력받기

2. y, x를 돌면서 돌이 있는위치 확인하기

3. 돌이 있다면 특정 방향에 대해서 검사하기
          특정 방향을 정했다면 반대 방향은 검사하지 않아도 된다.
          그 이유는 내가 오른쪽으로 검사했다면 오른쪽 위치에 있을때 왼쪽은 이미 검사를 한 상태이기 때문이다.

    3-1. 총 8방향 중 반대 방향을 제외한 4가지 방향을 확인한다.
    
    3-2. 총 5개의 돌을 확인해야 하므로 이동이 가능한지 바운더리 검사를 한다.

    3-3. 이동이 가능하다면 진행하는 방향에 돌이 있는제 체크한다.

    3-4. 모든 돌이 있다면 결과를 출력하고 종료

    3-5. 중간에 돌이 없다면 검사를 중지하고 다음위치로 이동


3. 소스코드

four = 4
zero = 0
yes = 'YES'
no = 'NO'
 
 
def gomoku():
    N = int(input())
    field = []
    for i in range(N):
        field.append(input())
    return find(field, N)
 
 
def find(field, N):
    for y in range(N):
        for x in range(N):
            # o가 아닐때는 체크할 필요가 없음
            if field[y][x] != 'o':
                continue
            # 오른쪽 체크
            if x + four < N and five_check(field, 01, y, x):
                return yes
            # 하단 체크
            if y + four < N and five_check(field, 10, y, x):
                return yes
            # 좌측상단
            if x - four >= zero and y - four >= zero and five_check(field, -1-1, y, x):
                return yes
            # 우측상단
            if x + four < N and y - four >= zero and five_check(field, -11, y, x):
                return yes
    return no
 
 
def five_check(field, dy, dx, y, x):
    for z in range(15):
        if field[y + (dy * z)][x + (dx * z)] != 'o':
            return False
    return True
 
 
for t in range(int(input())):
    answer = gomoku()
    print('#{} {}'.format(t+1, answer))

댓글

💲 광고입니다.