Algorithm/Simulation

[Python] 백준 2615번 오목

코딩쪼앙 2023. 5. 25. 21:48

문제

 

2615번: 오목

오목은 바둑판에 검은 바둑알과 흰 바둑알을 교대로 놓아서 겨루는 게임이다. 바둑판에는 19개의 가로줄과 19개의 세로줄이 그려져 있는데 가로줄은 위에서부터 아래로 1번, 2번, ... ,19번의 번호

www.acmicpc.net

입력

  • 19줄에 각 줄마다 19개의 숫자로 표현되는데, 검은 바둑알은 1, 흰 바둑알은 2, 알이 놓이지 않는 자리는 0으로 표시되며, 숫자는 한 칸씩 띄어서 표시된다.

출력

  • 첫줄에 검은색이 이겼을 경우에는 1을, 흰색이 이겼을 경우에는 2를, 아직 승부가 결정되지 않았을 경우에는 0을 출력한다. 검은색 또는 흰색이 이겼을 경우에는 둘째 줄에 연속된 다섯 개의 바둑알 중에서 가장 왼쪽에 있는 바둑알(연속된 다섯 개의 바둑알이 세로로 놓인 경우, 그 중 가장 위에 있는 것)의 가로줄 번호와, 세로줄 번호를 순서대로 출력한다.

입력 예제

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 2 0 0 2 2 2 1 0 0 0 0 0 0 0 0 0 0
0 0 1 2 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
0 0 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 2 2 0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 2 1 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

출력 예제

1
3 2

문제 풀이

  • 탐색을 마친 후 가장 왼쪽의 좌표를 출력해야하므로 오른쪽으로 뻗어나갈 좌표값들을 리스트에 넣는다.
    • → ↓ ↘ ↗
  • 검은색이나 흰 바둑이 놓여있는 경우만 탐색한다.
  • 오른쪽으로 뻗어나가면서 오목이 5개 연속된 경우를 확인한다. 
    • 이 때 여섯개가 연속될 수 있으므로 육목인 경우를 체크하고, 육목이라면 종료하고, 다음 방향의 탐색을 시작한다.
    • 육목이 아닌경우 조건을 만족하므로, 바둑색과 좌표를 출력하고, 코드를 종료한다.
  • 모든 탐색을 마친 후 코드가 종료되지 않았다면, 게임이 끝나지 않은 경우이므로 0을 출력한다.

코드

#  → ↓ ↘ ↗
# 가장 왼쪽의 좌표값 출력해야하므로 오른쪽으로 뻗어 나가야함
dy = [0,1,1,-1]
dx = [1,0,1,1]
n = 19

# 연속되는 5개의 검은 알 있는지 체크하는 함수
def check(y,x):
    target = array[y][x]
    for i in range(4):
        cnt = 1
        ny = y + dy[i]
        nx = x + dx[i]
        # 이동한 곳의 바둑 색도 같다면 뻗어나가면서 계속 탐색
        while 0 <= ny < n and 0 <= nx < n and array[ny][nx] == target:
            cnt += 1
            ny += dy[i]
            nx += dx[i]
            if cnt == 5:
                # 육목인 경우 조건 만족 x
                if 0 <= y - dy[i] < n and 0 <= x - dx[i] < n and array[y - dy[i]][x - dx[i]] == target:
                    break
                if 0 <= ny + dy[i] < n and 0 <= nx + dx[i] < n and array[ny + dy[i]][nx + dx[i]] == target:
                    break

                # 육목이 아니라면 조건 만족했으므로, 가장 왼쪽에 있는 좌표 출력 후 종료
                print(target)
                print(y + 1, x + 1)
                exit(0)

        # 다음 탐색 위해 이동
        ny += dy[i]
        nx += dx[i]


array = [list(map(int,input().split())) for _ in range(19)]
for a in range(n):
    for b in range(n):
        if array[a][b] != 0:
            check(a,b)

# 아직 게임이 끝나지 않은 경우 0출력
print(0)