알고리즘 사용된 코드 (4방향 탐색)
dy = [1,0,1,-1] # 아 오 대각, 역대각
dx = [0,1,1,1]
start_time = time.time()
def o_mok(y,x):
# 4방향 탐색
for bang in range(4):
cnt = 1 # 기준 좌표에 돌이 있다 cnt = 1부터 시작
# 돌 4개를 탐색
for power in range(1, 5):
ny = y + (dy[bang] * power)
nx = x + (dx[bang] * power)
if not (0 <= ny < n and 0 <= nx < n): break
# 돌을 발견하면 count
if arr[ny][nx] == 'o': cnt += 1
if cnt == 5: # 오목 발견
return True
return False
def game_start():
for r in range(n):
for c in range(n):
if arr[r][c] == 'o':
if o_mok(r,c):
return 'YES'
return 'NO'
t = int(input())
for tc in range(1,t+1):
n = int(input())
arr = [input() for _ in range(n)]
result = game_start()
print(f'#{tc} {result}')
해결한 코드 1
def o_mok():
flag = 0
# 가로
for i in range(n):
for j in range(n):
if j +4 > n: break
if j + 4 < n and arr[i][j] == 'o' and arr[i][j + 1] == 'o' and arr[i][j + 2] == 'o' and arr[i][j + 3] == 'o' and arr[i][j + 4] == 'o':
flag = 1
return flag
# 세로
for i in range(n):
for j in range(n):
if i+4 > n: break
if i + 4 < n:
if arr[i][j] == 'o' and arr[i + 1][j] == 'o' and arr[i + 2][j] == 'o' and arr[i + 3][j] == 'o' and arr[i + 4][j] == 'o':
flag = 1
return flag
# 역 대각선으로 보기
for i in range(n):
for j in range(n - 1, -1, -1):
if i + 4 > n and j - 4 <= 0: break
if i + 4 < n and j - 4 >= 0:
if arr[i][j] == 'o' and arr[i + 1][j - 1] == 'o' and arr[i + 2][j - 2] == 'o' and arr[i + 3][j - 3] == 'o' and arr[i + 4][j - 4] == 'o':
flag = 1
return flag
# 정 대각선
for i in range(n):
for j in range(n):
if i + 4 > n and j + 4 > n: break
if i + 4 < n and j + 4 < n:
if arr[i][j] == 'o' and arr[i + 1][j + 1] == 'o' and arr[i + 2][j + 2] == 'o' and arr[i + 3][j + 3] == 'o' and arr[i + 4][j + 4] == 'o':
flag = 1
return flag
t = int(input())
for tc in range(1,t+1):
n = int(input())
arr = [list(input()) for _ in range(n)]
stack = [0 for _ in range(4)] # 가로 세로 대각 역대각
# print(f'#{tc}')
# for x in arr:
# print(x)
if o_mok():
print(f'#{tc} YES')
else:
print(f'#{tc} NO')
# print(stack)
해결한 코드 2
def o_mok():
flag = 0
# 가로
for i in range(n):
for j in range(n):
if j + 4 < n:
if arr[i][j] == 'o':
stack[0] += 1
if arr[i][j + 1] == 'o':
stack[0] += 1
if arr[i][j + 2] == 'o':
stack[0] += 1
if arr[i][j + 3] == 'o':
stack[0] += 1
if arr[i][j + 4] == 'o':
stack[0] += 1
flag = 1
return flag
else:
stack[0] -= 1
else:
stack[0] -= 1
else:
stack[0] -= 1
else:
stack[0] -= 1
# 세로
for i in range(n):
for j in range(n):
if i + 4 < n:
if arr[i][j] == 'o':
stack[1] += 1
if arr[i + 1][j] == 'o':
stack[1] += 1
if arr[i + 2][j] == 'o':
stack[1] += 1
if arr[i + 3][j] == 'o':
stack[1] += 1
if arr[i + 4][j] == 'o':
stack[1] += 1
flag = 1
return flag
else:
stack[1] -= 1
else:
stack[1] -= 1
else:
stack[1] -= 1
else:
stack[1] -= 1
# 역 대각선으로 보기
for i in range(n):
for j in range(n - 1, -1, -1):
if i + 4 < n and j - 4 >= 0:
if arr[i][j] == 'o':
stack[3] += 1
if arr[i + 1][j - 1] == 'o':
stack[3] += 1
if arr[i + 2][j - 2] == 'o':
stack[3] += 1
if arr[i + 3][j - 3] == 'o':
stack[3] += 1
if arr[i + 4][j - 4] == 'o':
stack[3] += 1
flag = 1
return flag
else:
stack[3] -= 1
else:
stack[3] -= 1
else:
stack[3] -= 1
else:
stack[3] -= 1
# 정 대각선
for i in range(n):
for j in range(n):
if i + 4 < n and j + 4 < n:
if arr[i][j] == 'o':
stack[2] += 1
if arr[i + 1][j + 1] == 'o':
stack[2] += 1
if arr[i + 2][j + 2] == 'o':
stack[2] += 1
if arr[i + 3][j + 3] == 'o':
stack[2] += 1
if arr[i + 4][j + 4] == 'o':
stack[2] += 1
flag = 1
return flag
else:
stack[2] -= 1
else:
stack[2] -= 1
else:
stack[2] -= 1
else:
stack[2] -= 1
t = int(input())
for tc in range(1,t+1):
n = int(input())
arr = [list(input()) for _ in range(n)]
stack = [0 for _ in range(4)] # 가로 세로 대각 역대각
# print(f'#{tc}')
# for x in arr:
# print(x)
if o_mok():
print(f'#{tc} YES')
else:
print(f'#{tc} NO')
틀린 코드 100개중 74개 맞음
t = int(input())
for tc in range(1,t+1):
n = int(input())
arr = [list(input()) for _ in range(n)]
# stack = [[0] * n for _ in range(n)]
stack = []
# print(f'#{tc}')
# for x in arr:
# print(x)
# 가로
for i in range(n):
for j in range(n):
if j + 4 < n:
if arr[i][j] == 'o':
stack.append(1)
if arr[i][j + 1] == 'o':
stack.append(1)
if arr[i][j + 2] == 'o':
stack.append(1)
if arr[i][j + 3] == 'o':
stack.append(1)
if arr[i][j + 4] == 'o':
stack.append(1)
else:
stack.pop()
else:
stack.pop()
else:
stack.pop()
else:
stack.pop()
# 세로
for i in range(n):
for j in range(n):
if i + 4 < n:
if arr[j][i] == 'o':
stack.append(1)
if arr[j][i + 1] == 'o':
stack.append(1)
if arr[j][i + 2] == 'o':
stack.append(1)
if arr[j][i + 3] == 'o':
stack.append(1)
if arr[j][i + 4] == 'o':
stack.append(1)
else:
stack.pop()
else:
stack.pop()
else:
stack.pop()
else:
stack.pop()
# 역 대각선으로 보기
for i in range(n):
for j in range(n-1,-1,-1):
if i+4 < n and j-4 >= 0:
if arr[i][j] == 'o':
stack.append(1)
if arr[i+1][j-1] == 'o':
stack.append(1)
if arr[i + 2][j - 2] == 'o':
stack.append(1)
if arr[i + 3][j - 3] == 'o':
stack.append(1)
if arr[i + 4][j - 4] == 'o':
stack.append(1)
else:
stack.pop()
else:
stack.pop()
else:
stack.pop()
else:
stack.pop()
# 정 대각선
for i in range(n):
for j in range(n):
if i+4 < n and j+4 < n:
if arr[i][j] == 'o':
stack.append(1)
if arr[i+1][j+1] == 'o':
stack.append(1)
if arr[i + 2][j + 2] == 'o':
stack.append(1)
if arr[i + 3][j + 3] == 'o':
stack.append(1)
if arr[i + 4][j + 4] == 'o':
stack.append(1)
else:
stack.pop()
else:
stack.pop()
else:
stack.pop()
else:
stack.pop()
if stack.count(1) >= 5:
print(f'#{tc} YES')
else:
print(f'#{tc} NO')