코딩테스트/백준
[백준] 2615 - 오목
rlatotquf45
2024. 11. 21. 16:39
728x90
반응형
문제 링크
문제 요약
오목 문제
- 19×19 바둑판 위에서 흑(1)과 백(2)이 교대로 바둑알을 놓습니다.
- 같은 색 바둑알이 연속으로 정확히 5개 놓이면 그 색이 승리합니다.
- 연속된 다섯 개의 바둑알은 가로, 세로, 대각선(좌상-우하, 좌하-우상) 방향으로 가능합니다.
- 여섯 개 이상의 바둑알이 연속되면 승리가 아닙니다.
- 승리한 경우, 가장 왼쪽(또는 세로로는 가장 위쪽) 바둑알의 좌표를 출력해야 합니다.
푼 방법
- 바둑판 상태 입력 받기:
- 19줄의 입력을 받아 19x19 이차원 배열로 바둑판을 표현합니다.
- 승리 조건 검사 함수 작성:
- 방향 설정: 네 가지 방향에 대해 검사를 수행합니다.
- 가로 방향 (0, 1)
- 세로 방향 (1, 0)
- 대각선 오른쪽 아래 (1, 1)
- 대각선 오른쪽 위 (-1, 1)
- 검사 함수: 각 방향에 대해 현재 위치에서 시작하여 같은 색의 돌이 연속된 개수를 셉니다.
- 연속된 돌의 개수가 정확히 5인지 확인합니다.
- 연속된 다섯 개의 돌 앞과 뒤에 같은 색의 돌이 있는지 확인합니다.
- 앞이나 뒤에 같은 색의 돌이 있으면 여섯 개 이상이 연속된 것이므로 승리가 아닙니다.
- 방향 설정: 네 가지 방향에 대해 검사를 수행합니다.
정답 코드
import sys
world = [list(map(int, sys.stdin.readline().split())) for _ in range(19)]
def check(y, x, dy, dx):
curr_color = world[y][x]
cnt = 1
ny, nx = y + dy, x + dx
while 0 <= ny < 19 and 0 <= nx < 19 and world[ny][nx] == curr_color:
cnt += 1
ny += dy
nx += dx
if cnt > 5:
break
if cnt != 5:
return False
# 이전 위치 검사
py, px = y - dy, x - dx
if 0 <= py < 19 and 0 <= px < 19 and world[py][px] == curr_color:
return False
# 다음 위치 검사
if 0 <= ny < 19 and 0 <= nx < 19 and world[ny][nx] == curr_color:
return False
return True
directions = [(0, 1), (1, 0), (1, 1), (-1, 1)]
for y in range(19):
for x in range(19):
if world[y][x] != 0:
for dy, dx in directions:
if check(y, x, dy, dx):
print(world[y][x])
print(y + 1, x + 1)
sys.exit()
print(0)
728x90
반응형