[Silver I]
https://www.acmicpc.net/problem/2615
2615번: 오목
오목은 바둑판에 검은 바둑알과 흰 바둑알을 교대로 놓아서 겨루는 게임이다. 바둑판에는 19개의 가로줄과 19개의 세로줄이 그려져 있는데 가로줄은 위에서부터 아래로 1번, 2번, ... ,19번의 번호
www.acmicpc.net
풀이
19x19의 모든 칸을 순회하며, 오목이 되는 지 여부를 Brute-Force로 검사하면 된다.
오목이 될 수 있는 모든 경우는 하향 직선 5개, 우하향 대각성 5개, 우향 직선 5개, 우상향 대각선 5개가 이어지는 4가지의 경우가 존재하며,
시작하는 돌의 바로 이전 칸과, 5개째가 아닌 6개째의 칸까지 같이 확인하여 6목이 되지 않는 지를 검사해야 한다.
AC.
b = []
for _ in range(19):
b.append(list(map(int, input().split())))
# 아래로 5개, 우하향 대각선 5개, 오른쪽으로 5개, 우상향 대각선 5개 (그러나, 6목 방지를 위해 시작에서 한칸 전부터, 5목이 되기 한칸 뒤까지 포함)
dr = [[-1, 1, 2, 3, 4, 5], [-1, 1, 2, 3, 4, 5], [0, 0, 0, 0, 0, 0], [1, -1, -2, -3, -4, -5]]
dc = [[0, 0, 0, 0, 0, 0], [-1, 1, 2, 3, 4, 5], [-1, 1, 2, 3, 4, 5], [-1, 1, 2, 3, 4, 5]]
# 체크
for r in range(19):
for c in range(19):
if b[r][c] == 0:
continue
for j in range(4):
cnt = 0
for i in range(6):
lr = r + dr[j][i]
lc = c + dc[j][i]
# 6목 이상 제외
if i == 0 or i == 5:
if lr < 0 or lr >= 19 or lc < 0 or lc >= 19 or b[lr][lc] != b[r][c]:
cnt += 1
else:
if lr < 0 or lr >= 19 or lc < 0 or lc >= 19:
continue
if b[lr][lc] == b[r][c]:
cnt += 1
if cnt == 6:
print(b[r][c])
print(r+1, c+1)
exit()
# 승부 결정 x
print(0)