Algorithm (PS)

[백준] 2615 오목 Python

minjiwoo 2022. 10. 27. 19:08
728x90

https://www.acmicpc.net/problem/2615

 

2615번: 오목

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

www.acmicpc.net

 

처음에는 단순하게 대각선 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