# 실패코드
board = [list(map(int, input().split())) for _ in range(19)]
for i in range(19):
for j in range(19):
if board[i][j] == 1: # black
temp = [0, 0, 0]
for k in range(1, 7):
if board[i][j + k] == 1:
temp[0] += 1
if board[i+k][j] == 1:
temp[1] += 1
if board[i+k][j+k] == 1:
temp[2] += 1
if 4 in temp:
print(1)
print(i+1, j+1)
exit()
if board[i][j] == 2:
temp = [0, 0, 0]
for k in range(1, 7):
if board[i][j + k] == 2:
temp[0] += 1
if board[i + k][j] == 2:
temp[1] += 1
if board[i + k][j + k] == 2:
temp[2] += 1
if 4 in temp:
print(2)
print(i+1, j+1)
exit()
print(0)
# 정답코드
board = [list(map(int, input().split())) for _ in range(19)]
# → ↓ ↘ ↗
dx = [0, 1, 1, -1]
dy = [1, 0, 1, 1]
for x in range(19): # 19 * 19만큼 반복
for y in range(19):
if board[x][y] != 0: # 자리에 돌이 있으면
focus = board[x][y]
for i in range(4): # 4개 방향 체크
cnt = 1
nx = x + dx[i]
ny = y + dy[i]
# 19*19 범위 내에서 반복 + 현재 돌과 같은 돌인지
while 0 <= nx < 19 and 0 <= ny < 19 and board[nx][ny] == focus:
cnt += 1
# 오목이 되었을때
if cnt == 5:
# 현재 돌의 직전 돌이 같은 돌인지 = 육목
if 0 <= x - dx[i] < 19 and 0 <= y - dy[i] < 19 and board[x - dx[i]][y - dy[i]] == focus:
break
# 연속하는 돌의 다음 돌이 같은 돌인지 = 육목
if 0 <= nx + dx[i] < 19 and 0 <= ny + dy[i] < 19 and board[nx + dx[i]][ny + dy[i]] == focus:
break
print(focus)
print(x + 1, y + 1)
exit(0)
# 다음 방향
nx += dx[i]
ny += dy[i]
print(0)
엄청 헤멨었던 코드... 처음 작성한 코드는 육목을 제대로 막아주질 못했다. 그래서 두번째 코드를 다시 작성했다.
찾을 방향인 dx, dy를 작성해준다. x와 y의 자리에 배치해보면 각각 (0, 1), (1, 0), (1, 1), (-1, 1)로 이동할수있게 된다.
바둑판의 크기인 19*19만큼 반복을 하고 현재 자리에 돌이 있다면 가로, 세로, 좌->우 대각선, 우->좌 대각선을 체크한다.
cnt는 현재 돌이 하나 있으니 1을 기본값으로 주고, 다음 돌의 위치를 nx, ny의 값에 넣어주고 조건을 확인하게 한다.
while문을 사용해 인덱스가 19*19 범위 내인지, 또 현재 돌과 같은 돌인지(흰돌인지 검은돌인지) 확인하고 반복문을 수행한다.
오목이 되었을때(cnt = 5) 이게 육목인지 아닌지를 체크하면 된다. 현재 돌의 직전 돌이 같은 돌이라면 육목이고, 연속하는 돌의 다음돌이 같은 돌이라면 육목이니 break로 반복문을 종료한다.
위치만 가지고 설명해본다면 이런 구조이다. [ 0, 1, 1, 1, 1, 1, 1, 0 ] 와 같은 형태일때 1번째 인덱스의 1이 현재 돌이라면 0번째 인덱스가 같은 돌인지, 6번째 인덱스가 현재 돌인지 확인하는 것이다.
그렇게 해서 오목이 되었다면 돌의 종류와 줄 수를 출력하고 프로그램을 종료한다. 그렇지 않다면 다음 방향을 확인해야하니 nx, ny의 값을 바꿔준다. 최종적으로 반복문을 돌았을때도 오목이 된 돌이 나오지 않는다면 아무도 이기지 않았음으로 0을 출력해준다.
https://www.acmicpc.net/problem/2615
2615번: 오목
오목은 바둑판에 검은 바둑알과 흰 바둑알을 교대로 놓아서 겨루는 게임이다. 바둑판에는 19개의 가로줄과 19개의 세로줄이 그려져 있는데 가로줄은 위에서부터 아래로 1번, 2번, ... ,19번의 번호
www.acmicpc.net
'study > Algorithm' 카테고리의 다른 글
[백준] 파이썬 9012번: 괄호 (1) | 2024.04.04 |
---|---|
[백준] 파이썬 3107 : IPv6 (0) | 2024.04.02 |
[백준] 파이썬 1244 : 스위치 켜고 끄기 (0) | 2024.04.02 |
[백준] 파이썬 16926번: 배열 돌리기 1 (0) | 2024.04.01 |
[백준] 파이썬 1652번: 누울 자리를 찾아라 (0) | 2024.04.01 |