Post
오목(백준 2615번) | Gihun Son

오목(백준 2615번)

💡 **Check Point !

( 해당사항 ✓체크 )

  1. 막힘 없이 수월하게 풀린 문제인가?

  2. 1시간이내로 풀렸던 문제인가?✓

  3. 1시간 이상 or 며칠을 두고 풀어봤더니 풀린 문제인가?

  4. 시간을 써도 도무지 풀 수 없는 문제인가?

  5. 솔루션을 찾아봤는가?


난이도 체감

  1. 최상

  2. 중✓


이해도

  1. 완벽히 이해✓

  2. 다소 헷갈리는 부분들이 있음

  3. 이해 못함

문제

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

https://upload.acmicpc.net/42c87203-247a-49d1-bc63-44397a7184db/-/preview/

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

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

Untitled

Untitled 1

나의 풀이

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
import sys
input=sys.stdin.readline
game_map=[]
for _ in range(19):
    game_map.append(list(map(int,input().strip().split())))
dx=[-1,1,1,0]
dy=[1,0,1,1]

for x in range(19):
    for y in range(19):
        if game_map[x][y]!=0:
            for i in range(4):
                mx=x+dx[i]
                my=y+dy[i]
                if 0<=mx<19 and 0<=my<19 and game_map[mx][my]==game_map[x][y]:
                    count=1
                    while 0<=mx<19 and 0<=my<19 and game_map[mx][my]==game_map[x][y]:
                        count+=1
                        mx=mx+dx[i]
                        my=my+dy[i]
                    if count==5:
                        if 0<=x-dx[i]<19 and 0<=y-dy[i]<19:
                            if game_map[x-dx[i]][y-dy[i]]!=game_map[x][y]:
                                print(game_map[x][y])
                                print(x+1,y+1)
                                exit(0)
                        else:
                            print(game_map[x][y])
                            print(x+1,y+1)
                            exit(0)
print(0)
  • 위 문제에서 4개의 방향을 정했다.
  • 연속된 돌이 있을 때, 출력해야 하는 것은 왼쪽 또는 위에 있는 돌이다. 따라서 연속되는 돌의 시작점을 찾을 때, 해당 지점이 왼쪽 또는 위쪽이 되도록 방향을 4방향으로 정했다.
  • 그 후 연속한 돌이 5개가 되는 경우에 출력하고 프로그램을 종료했다. 이 때 주의할 점은 count가 6이상일 때에도 정답이 아니기 때문에, count가 5가 나와도 이전 돌이 같은 돌이라서 6이상의 수가 되는지 확인해주어야 한다.
This post is licensed under CC BY 4.0 by the author.