새소식

PS/백준

[백준/2615] 오목 (Python)

  • -

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

 

2615번: 오목

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

www.acmicpc.net

 

Difficulty : Silver 1

 

Status : Solved

 

Time : 00:21:20

 

 


 

문제 설명

 

더보기

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

 

 

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

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

 

 

 

입력 및 출력

 

더보기

입력

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

 

출력

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

 

입력 예시

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 2 0 0 2 2 2 1 0 0 0 0 0 0 0 0 0 0
0 0 1 2 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
0 0 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 2 2 0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 2 1 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

 

출력 예시

1
3 2

 

 


 

풀이

 

기본적인 탐색 문제. 6목 이상은 승리에 해당되지 않으므로, visited 배열을 이용하는 것이 좋다. 탐색 순서상 최대 8방향, 최소 4방향만 탐색하면 된다. 방향에 따라 visited를 체크할 수 있도록 하자. 탐색 시 방문한 장소가 정확히 5곳이라면 바로 해당 좌표 및 좌표에 해당하는 값(흑 1, 백 2)을 출력하면  된다.

주의할 점은, 방향에 따라 출력해야 할 좌표가 달라질 수 있다는 점 명심하자.

 

  • find_lines : 탐색함수. 주어진 시작좌표와 방향, 그리고 목표값을 가지고 전진이 가능할 때까지(바둑판을 벗어나지 않으며 같은 목표값이 계속 나올 때가지) 전진하며 이동을 카운트한다. 그 카운트값을 반환한다.
  • search : 바둑판을 순회하며 만약 흑돌 혹은 백돌을 만났을 경우 find_lines를 호출한다. 만약 그 값이 5라면 앞서 설명한 대로 해당 좌표 및 좌표에 해당하는 값을 출력한다.
  • solve : 메인함수. search 함수의 결과를 조건에 따라 출력한다.

 

 

 

풀이 코드

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

N = 19
map_list = [list(map(int, input().split())) for _ in range(N)]
visited = [[[False]*4 for _ in range(N)] for _ in range(N)]

def find_lines(x, y, r, target) :
  cnt = 0
  while -1 < x < N and -1 < y < N and map_list[y][x] == target and not visited[y][x][r]:
    cnt += 1
    visited[y][x][r] = True
    x, y = x + dx[r], y + dy[r]

  return cnt

def search():
  for i in range(N) :
    for j in range(N) :
      if map_list[i][j] > 0 :
        for k in range(4) :
          if find_lines(j, i, k, map_list[i][j]) == 5 :
            x, y = (j, i) if k > 0 else (j + dx[k]*4, i + dy[k]*4)
            return map_list[i][j], (x, y)

  return 0, (-1, -1)

def solve() :
  winner, (x, y) = search()
  print(winner)
  if winner > 0 :
    print(y+1, x+1)

solve()

풀이 완료~

'PS > 백준' 카테고리의 다른 글

[백준/2573] 빙산 (Python)  (0) 2023.03.15
[백준/2659] 십자카드 문제 (Python)  (0) 2023.03.15
[백준/2539] 모자이크 (Python)  (2) 2023.03.14
[백준/6987] 월드컵 (Python)  (0) 2023.03.13
[백준/2116] 주사위 쌓기 (Python)  (0) 2023.03.10
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.