cross
x
, y
필요flag
: 왼쪽 아래 0, 오른쪽 아래 11
반환, 못 찾은 경우 0
반환YES
NO
def cross(grid, x, y, flag):
# x, y : 시작점
# flag 0: 왼쪽아래 대각선, 1: 오른쪽 아래 대각선
for i in range(5):
if flag and grid[y + i][x + i] == '.':
return 0
elif not flag and grid[y + i][x + 4 - i] == '.':
return 0
return 1 # 찾은 경우
T = int(input())
for tc in range(1, T + 1):
n = int(input())
grid = [input() for _ in range(n)] # 가로 줄 판단 위한 리스트
tmp = list(zip(*grid))
grid_h = [] # 세로 줄 판단 위한 리스트
for i in range(n):
grid_h.append(''.join(tmp[i]))
flag = 0
res = ''
# 대각선 판단
for y in range(n - 4):
for x in range(n - 4):
# 오목인 경우
if cross(grid, x, y, 0) or cross(grid, x, y, 1):
res = 'YES'
break
if res:
break
# if not res:
# res = 'NO'
if not res:
# 가로, 세로 판단
for i in range(n):
for j in range(n - 4):
# 오목인 경우
if grid[i][j:j + 5] == 'ooooo' or grid_h[i][j:j + 5] == 'ooooo':
res = 'YES'
break
if res:
break
if not res:
res = 'NO'
print(f'#{tc} {res}')
세로 배열로 바꾸는 과정을 알고 있었는데, 자꾸 잊어먹는다...! 잊지 말자!