문제:

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

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

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

입력:

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

출력:

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

풀이방법:

 이 문제는 오목인지는 판정한 뒤에 육목에 해당하는지에 판단 여부가 중요한 문제다. 우선 19x19의 모든 점에서 흰돌이나 검은돌이 있다면 오목인지 판정을 시작한다. 오목을 판정하는 방법은 해당 점으로 부터 8 방향으로 움직이며 돌이 연속되는지 판단하도록 한다. 기준점으로부터 연속하여 4개가 더 있다면 우선 오목이라고 판정한다. 그리고 한 번 더 해당 방향으로 이동하고, 처음 기준점에서 움직였던 반대 방향(180도 반대)으로 한 칸씩 움직여서 육목의 여부 판정을 더 수행한다. 정확한 오목이라면 값을 반환하고 저장하도록 한다.

 동시에 이기는 경우는 없기 때문에 값을 가지고 있는 리스트의 인덱스가 정답에 해당하며, 조건에 맞게(가장 왼쪽에 있는 바둑알) 출력하도록 한다. 만약 둘 다 비어 있다면 아직 승부가 결정되지 않은 경우이므로 0을 출력한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
dx = [0-1-1-10111]
dy = [110-1-1-101]
def check_win(x,y):
    key = board[x][y]
    for i in range(8):
        find = False
        tx,ty = x,y
        for j in range(4):
            nx = tx + dx[i]
            ny = ty + dy[i]
            if 0<= nx < 19 and 0<= ny <19:
                if key==board[nx][ny]:
                    tx, ty = nx, ny
                    find = True
                    continue
                else:
                    find = False
                    break
            else:
                find=False
                break
        if find:
            nx, ny = tx+dx[i], ty+dy[i]
            if 0<=nx<19 and 0<=ny<19:
                if key==board[nx][ny]:
                    continue
            ti = (i+4)%8
            nx, ny = x+dx[ti], y+dy[ti]
            if 0<=nx<19 and 0<=ny<19:
                if key==board[nx][ny]:
                    continue
            return 1
    return 0
 
board = []
for _ in range(19):
    board.append(list(map(int,input().split())))
 
answer = [[],[]]
for i in range(19):
    for j in range(19):
        if board[i][j]:
            if check_win(i,j):
                answer[board[i][j]-1].append((i+1,j+1))
for i in range(2):
    if answer[i]:
        answer_list = sorted(answer[i], key=lambda x: x[1])
        print(i+1)
        print(*answer_list[0])
if not len(answer[0]) and not len(answer[1]):
    print(0)
cs

문제링크:

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

 

2615번: 오목

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

www.acmicpc.net

 

'Algorithm > Python' 카테고리의 다른 글

[BOJ]2635. 수 이어가기  (0) 2022.04.19
[BOJ]2596. 비밀편지  (0) 2022.04.14
[BOJ]2628. 종이자르기  (0) 2022.04.07
[BOJ]9205. 맥주 마시면서 걸어가기  (0) 2022.04.05
[BOJ]1439. 뒤집기  (0) 2022.03.31

+ Recent posts