[백준 2615][python] 오목

alllloha·2021년 10월 16일
0

문제

같은 색의 바둑알이 연속적으로 다섯 알을 놓이면 그 색이 이기게 된다. 여기서 연속적이란 가로, 세로 또는 대각선 방향 모두를 뜻한다. 하지만 여섯 알 이상이 연속적으로 놓인 경우에는 이긴 것이 아니다.

입력으로 바둑판의 어떤 상태가 주어졌을 때, 검은색이 이겼는지, 흰색이 이겼는지 또는 아직 승부가 결정되지 않았는지를 판단하는 프로그램을 작성하시오. 단, 검은색과 흰색이 동시에 이기거나 검은색 또는 흰색이 두 군데 이상에서 동시에 이기는 경우는 입력으로 들어오지 않는다.

입력

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

출력

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

해결방법

  1. 연속된 바둑알을 확인하기 위해서는 현재 위치의 오른쪽, 아래 왼쪽, 아래, 아래 오른쪽 네 방향을 확인하면 된다.
  2. 만일 바둑알이 있다면 네 방향을 탐색하고 같은 색이 있다면 다른 색이 있을때까지 탐색한다.
  3. 같은 색의 바둑알이 다섯개 있다면 육목을 확인하기 위해 처음 탐색을 시작한 부분의 이전 바둑알의 색을 찾는다.

유의할 점
다섯개의 바둑알 중에서 가장 왼쪽에 있는 바둑알을 찾기 위해 위치를 저장하는 Loc 배열을 추가했다.

코드


board = []

for _ in range(19):
    board.append(list(map(int, input().split())))

#검은 바둑알은 1, 흰 바둑알은 2

dx = [0, 1, 1, 1]
dy = [1, 1, 0, -1]

def check():
    for i in range(19):
        for j in range(19):
            visit = [[0]*19 for _ in range(19)]
            if board[i][j] > 0: #아직 확인해보지 않은 칸이라면
                #print(i, j)
                visit[i][j] = 1
                result = [(i, j)]

                for k in range(4):
                    cnt = 1 # 연속되는 바둑알을 세기 위한 변수
                    nx = i + dx[k]
                    ny = j + dy[k]
                
                    while 0<=nx<19 and 0<=ny<19 and visit[nx][ny] == 0 and board[i][j] == board[nx][ny] : #다음칸에 색이 같은 알이 있다면
                        cnt += 1
                        visit[nx][ny] = 1
                        result.append((nx, ny))
                        nx += dx[k]
                        ny += dy[k]

                    if cnt == 5:
                        bx = i - dx[k]
                        by = j - dy[k]
                        if 0<=bx<19 and 0<=by<19 and board[bx][by] == board[i][j]: #육목이 되는 경우
                            continue
                        else:
                            return board[i][j], result, k
    return 0, 0, 0

a, b, k= check()
if a > 0:
    if k == 2:
        print(a)
        print(b[0][0]+1, b[0][1]+1)
    else:
        loc = sorted(b, key = lambda x: (x[1], -x[0]))
        print(a)
        print(loc[0][0]+1, loc[0][1]+1)
else:
    print(a)

0개의 댓글