728x90

백준 2615 - 오목

시간 제한 1초, 메모리 제한 128MB

# 조건

  • 오목은 바둑판에 검은 바둑알과 흰 바둑알을 교대로 놓아서 겨루는 게임이다.
  • 바둑판에는 19개의 가로줄과 19개의 세로줄이 그려져 있는데 가로줄은 위에서부터 아래로 1번, 2번, ... ,19번의 번호가 붙고 세로줄은 왼쪽에서부터 오른쪽으로 1번, 2번, ... 19번의 번호가 붙는다.
  • 같이 같은 색의 바둑알이 연속적으로 다섯 알을 놓이면 그 색이 이기게 된다.
    • 여기서 연속적이란 가로, 세로 또는 대각선 방향 모두를 뜻한다.
    • 즉, 위의 그림은 검은색이 이긴 경우이다. 하지만 여섯 알 이상이 연속적으로 놓인 경우에는 이긴 것이 아니다.
  • 입력으로 바둑판의 어떤 상태가 주어졌을 때, 검은색이 이겼는지, 흰색이 이겼는지 또는 아직 승부가 결정되지 않았는지를 판단하는 프로그램을 작성하시오.
  • 단, 검은색과 흰색이 동시에 이기거나 검은색 또는 흰색이 두 군데 이상에서 동시에 이기는 경우는 입력으로 들어오지 않는다.

입력

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

출력

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

# 접근 방법

  • 완전 탐색으로 풀어주면 된다.
  • 우선 입력받은 바둑 판을 2중 for문으로 탐색하며 1 또는 2를 발견한 경우 check 함수를 돌려준다.
  • check 함수에서는 크게 4개의 방향을 체크해준다.
    • 좌우, 상하, 왼쪽위와 오른쪽 아래, 오른쪽 위와 왼쪽 아래
    • 해당 방향에 일직선으로 정확히 5개의 돌이 존재하는 경우 승리한 돌의 색깔을 출력해주고
    • 해당 좌표 중 가장 왼쪽에 있는 것을 출력해주면 된다.

import sys  
sys.stdin = open('input.txt')  
input = sys.stdin.readline  

def check(si, sj, color):  
    # 상하, 좌우, 왼쪽위오른쪽아래, 오른쪽위왼쪽아래  
    # 왼쪽 두개는 i, 오른쪽 두개는 j    
    d = [[-1, 1, 0, 0], [0, 0, -1, 1], [-1, 1, -1, 1], [-1, 1, 1, -1]]  
    for k in range(4):  
        cnt = 1  
        result = [(si, sj)]  
        for u in range(2):  
            ni, nj = si, sj  
            while True:  
                ni, nj = ni + d[k][u], nj + d[k][u + 2]  
                if 0<=ni<19 and 0<=nj<19 and arr[ni][nj] == color:  
                    cnt += 1  
                    result.append((ni, nj))  
                else:  
                    break  
        # 돌이 정확히 5개라면  
        if cnt == 5:  
            result.sort(key=lambda x:(x[1], x[0]))  
            print(color)  
            print(result[0][0]+1, result[0][1]+1)  
            return 1  
arr = [[*map(int, input().split())] for _ in range(20)]  

flag = 0  
for i in range(19):  
    for j in range(19):  
        if arr[i][j]:  
            flag = check(i, j, arr[i][j])  
            if flag:  
                sys.exit()  

print(0)
728x90