https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AXaSUPYqPYMDFASQ&categoryId=AXaSUPYqPYMDFASQ&categoryType=CODE&problemTitle=11315&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1 

 

SW Expert Academy

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

swexpertacademy.com

 

 

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

 

 

방법1

범위 내에서 까지만 돌기

testCase = int(input())

def traversalMatrix(n, data):
    dx = [0, 1, 1, 1]    #right→, down↓, right-down↘, left-down↙
    dy = [1, 0, 1, -1]

    for startX in range(n) :
        for startY in range(n) :
            #'o'인 지점부터 찾기 시작
            if data[startX][startY] == 'o' :
                #현재 o 지점으로부터 순서대로 다음 방문할 곳 찾을 것
                # 0 : right→, 1 : down↓, 2 : right-down↘, 3 : left-down↙ 
                for d in range(4) :
                    nextX = startX              #'o'이 있는 현재 지점(시작점)
                    nextY = startY
                    count = 0
                    #2차원 리스트 범위 내에 있고 'o'인것 찾기
                    #0부터 n까지 갈수 있는 방향, 갈수 있는 만큼 가본다
                    while 0 <= nextX < n and 0 <= nextY < n and data[nextX][nextY] == 'o' :
                        count += 1
                        nextX += dx[d]          #다음 갈 곳 정해주기
                        nextY += dy[d]
                    
                    if count >= 5 :
                        return "YES"
    return "NO"

for testCase in range(testCase) :                #테스트 케이스
    n = int(input())
    dataList = []
    for case in range(n) :
        data = []
        temp = input()
        for t in temp :
            data.append(t)
        dataList.append(data)
    print(f'#{testCase +1} {traversalMatrix(n, dataList)}')

 

방법 2

범위 넘어가면 컷해주기

import sys
sys.stdin = open("temp.txt", "r")

testCase = int(input())

def traversalMatrix(n, data):
    dx = [0, 1, 1, 1]    #right→, down↓, right-down↘, left-down↙
    dy = [1, 0, 1, -1]

    for startX in range(n) :
        for startY in range(n) :
            #'o'인 지점부터 찾기 시작
            if data[startX][startY] == 'o' :
                
                # right→ 한번 쭉 갔다오기
                # down↓ 한번 쭉 갔다오기
                # right-down↘ 한번 쭉 갔다오기
                # left-down↙ 한번 쭉 갔다오기
                for i in range(4) :
                    next_x = startX         #'o발견 지점'
                    next_y = startY
                    count = 1               #처음 0 발견한 시점 카운트
                    while True :
                        next_x += dx[i]     #현재 지점으로부터 dx[i] 만큼 + 해주면서 다음으로 이동
                        next_y += dy[i]

                        #범위 벗어나면 컷해주기
                        if next_x < -1 or next_x > n-1 or next_y < -1 or next_y > n-1 :
                            break
                        
                        #위에서 break 걸었으니까 무조건 범위 내임
                        if data[next_x][next_y] == "o" :
                            count += 1
                        
                        #5개인경우 YES
                        if count >= 5 :
                            return "YES"
    return "NO"

for testCase in range(testCase) :                #테스트 케이스
    n = int(input())
    dataList = []
    for case in range(n) :
        data = []
        temp = input()
        for t in temp :
            data.append(t)
        dataList.append(data)
    print(f'#{testCase +1} {traversalMatrix(n, dataList)}')

https://pinenamu.tistory.com/287 참고

[swea | D3] 11315. 오목 판정(4방향, 대각선)