728x90
https://www.acmicpc.net/problem/2615
처음에는 단순하게 대각선 4방향 + 상하좌우 4방향 총 8방향을 모두 체크해야겠다고 생각했으나,
1.오목의 특성상 그럴 필요없이 총 4가지 방향만 체크해주면 된다
⇩, ⇘, ⇗ ➔
하, 우하, 우상, 우 네가지 방향을 확인해주면 된다.
dx = [1, 1, -1, 0] # 하, 우하, 우상, 우
dy = [0, 1, 1, 1]
2.항상 좌측, 위 부터 시작하도록 하여 연속된 5개 오목 중 가장 왼쪽이면서 위쪽인 좌표를 (i, j) 라고 볼 수 있다.
3. count == 5일 때 , 오목이 6개 이상 연속되는 경우는 승패 여부로 포함하지 않으므로, 같은 방향의 한칸 더 확인해준다.
if 0 <= nx + dx[k] < 19 and 0 <= ny + dy[k] < 19:
if array[nx + dx[k]][ny + dy[k]] == array[nx][ny]:
break
이때 nx,ny에서 같은 방향으로 한칸 앞으로 가는 경우와, 시작점인 i,j같에서 한칸 뒤로 가는 경우를 확인해 주어야 한다.
if 0 <= i - dx[k] < 19 and 0 <= j - dy[k] < 19:
if array[i - dx[k]][j - dy[k]] == array[i][j]:
break
전체코드는 다음과 같다.
# 2615 오목
import sys
input = sys.stdin.readline
array = []
for _ in range(19):
array.append(list(map(int, input().split())))
dx = [1, 1, -1, 0] # 하, 우하, 우상, 우
dy = [0, 1, 1, 1]
def check():
for i in range(19):
for j in range(19):
if array[i][j] > 0: # black or white
for k in range(4):
nx = i + dx[k]
ny = j + dy[k]
# 8방향 확인하기
count = 1
# 오목판 범위 초과
if nx < 0 or nx >= 19 or ny < 0 or ny >= 19:
continue
while 0 <= nx < 19 and 0 <= ny < 19 and array[nx][ny] == array[i][j]:
count += 1
if count == 5:
# 한칸 더 체크해서 6개 이상 같은지 확인해주어야 한다
if 0 <= nx + dx[k] < 19 and 0 <= ny + dy[k] < 19:
if array[nx + dx[k]][ny + dy[k]] == array[nx][ny]:
break
if 0 <= i - dx[k] < 19 and 0 <= j - dy[k] < 19:
if array[i - dx[k]][j - dy[k]] == array[i][j]:
break
return array[i][j], i+1, j+1
nx += dx[k] # 같은 방향으로 한칸 더 이동하기
ny += dy[k]
return 0, -1, -1
color, x, y = check()
if color == 0:
print(0)
else:
print(color)
print(x, y)
728x90
'Algorithm (PS)' 카테고리의 다른 글
[백준] 13022 : 늑대와 올바른 단어 Python/파이썬 풀이 (0) | 2022.11.04 |
---|---|
[백준] 2470 두 용액 파이썬 (0) | 2022.10.30 |
[백준] 5972 택배배송 Python (0) | 2022.10.26 |
[백준] 14503 로봇청소기 in Python (0) | 2022.10.23 |
[백준] 19598 최소 회의실 개수 Python (0) | 2022.10.23 |