SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
N X N 크기의 판이 있다. 판의 각 칸에는 돌이 있거나 없을 수 있다. 돌이 가로, 세로, 대각선 중 하나의 방향으로 다섯 개 이상 연속한 부분이 있는지 없는지 판정하는 프로그램을 작성하라.
[입력]
첫 번째 줄에 테스트 케이스의 수 T가 주어진다.
각 테스트 케이스의 첫 번째 줄에는 하나의 정수 N(5 ≤ N ≤ 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)}')
'코테풀이 > 구현' 카테고리의 다른 글
[cos pro 1급] 단어를 순서대로 적으세요 (0) | 2022.05.25 |
---|---|
[swea | D3] 1206. [S/W 문제해결 기본] 1일차 - View (0) | 2022.05.23 |
[swea | D2] 2001. 파리 퇴치 (0) | 2022.05.23 |
[Cos Pro 1급] 3회 문제 5(전광판 어플, 한칸씩 밀기) (0) | 2022.05.23 |
[Cos Pro 1급] 3회 문제 3(비숍 대각선 이동 위치이동) (0) | 2022.05.23 |
[swea | D3] 11315. 오목 판정(4방향, 대각선)