https://www.acmicpc.net/problem/2072
2072번: 오목
19x19크기의 바둑판에, 돌을 놓을 좌표가 주어지면 이 게임이 몇 수만에 끝나는 지를 알아보려고 한다. 사용하고자 하는 바둑판의 모양은 위의 그림과 같으며, (1, 1)이 가장 왼쪽 위의 좌표이고 (19
www.acmicpc.net
처음엔 간단하게 돌을 놓은 순간 board 전체를 탐색해서 5칸이 이어진 구간이 있으면 그 순간의 i를 출력하는 간단한 문제로 생각했다.
하지만 이러한 경우 때문에 생각외로 잘 풀리지 않아 많은 시도를 한 후에 겨우 풀었다.
저런 조건때문에 탐색을 시작한 지점(x,y)에 대해 8방향까지 (x+5,y+5) 이렇게 탐색 하는 방법은 올바르지 않은 탐색이다.
(x,y)로 부터 8방향을 탐색하는데 (x,y)가 오목 5개의 중앙 지점이라고 생각하고 8방향에 대해 똑같은 돌이 몇개나 있는지 count를 세서 저장하는 것이다.
res = [0] * 8
std = board[x][y]
for k in range(8):
nx = x + dx[k]
ny = y + dy[k]
while board[nx][ny]:
if board[nx][ny] == std:
nx += dx[k]
ny += dy[k]
res[k] += 1
else:
break
dx,dy의 index를 8방향에 대한 반시계방향 순서로 했기 때문에 index 4의 차이는 반대방향을 가르키게 된다.
for i in range(4):
if res[i] + res[i+4] == 4:
return True
return False
따라서 res[i] + res[i+4]의 값이 4이면 위의 6개 이상 돌이 놓여저 있는 경우를 제외하고 완벽하게 5개 있는 경우만 check
dx = [0, 1, 1, 1, 0, -1, -1, -1]
dy = [-1, -1, 0, 1, 1, 1, 0, -1]
def check(x,y):
res = [0] * 8
std = board[x][y]
for k in range(8):
nx = x + dx[k]
ny = y + dy[k]
while board[nx][ny]:
if board[nx][ny] == std:
nx += dx[k]
ny += dy[k]
res[k] += 1
else:
break
for i in range(4):
if res[i] + res[i+4] == 4:
return True
return False
board = [[0] * 21 for _ in range(21)]
n = int(input())
for i in range(1,n+1):
a,b = list(map(int,input().split()))
if i % 2 == 1: #홀수(흑)
board[a][b] = 1
else: # 짝수(백)
board[a][b] = 2
if check(a,b) == True:
print(i)
exit()
print(-1)
'Algorithm > Algorithm Problem' 카테고리의 다른 글
백준 1911 흙길 보수하기(구현,그리디) (0) | 2022.06.03 |
---|---|
백준 15729 방탈출(그리디) (0) | 2022.06.03 |
백준 11000 강의실 배정(Heap, 우선순위 큐) (0) | 2022.05.22 |
백준 13900 순서쌍의 곱의 합(구현) (0) | 2022.05.20 |
백준 11571 분수를 소수로(구현) (0) | 2022.05.20 |