코딩테스트/백준

[백준] 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
반응형