import sys
sys.setrecursionlimit(100000)
array = [[None] for _ in range(19)]
for i in range(19):
array[i] = list(map(int, input().split()))
# 우,우하,하,우상
dx = [0, 1, 1, -1]
dy = [1, 1, 0, 1]
for x in range(19):
for y in range(19):
if array[x][y]: # 값이 0이 아닐 경우
color = array[x][y]
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
cnt = 1
while 0 <= nx < 19 and 0 <= ny < 19 and array[nx][ny] == color:
cnt += 1
if cnt == 5:
if (0 <= nx + dx[i] < 19 and 0 <= ny + dy[i] < 19) and (
array[nx + dx[i]][ny + dy[i]] == color):
break
if (0 <= x - dx[i] < 19 and 0 <= y - dy[i] < 19) and array[x - dx[i]][y - dy[i]] == color:
break
print(color)
print(x + 1, y + 1)
sys.exit(0)
nx += dx[i]
ny += dy[i]
print(0)
* 탐색 방향 순서 *
1. 우
2. 우하
3. 하
4.우상
바둑알이 6개 이상인지 확인을 해야하는데,
이 부분 때문에 좀 오래 걸렸다 ㅠㅠ
cnt가 5일 때,
즉 현재 위치에서 탐색한 바둑알의 개수가 5개로 일치할 때,
6개 이상의 바둑알이 나열되어 있는지 다시 한 번 확인을 해야 한다.
만약 x,y 위치에서 현재 움직인 방향의 반대 방향 위치에
color와 같은 값이 있으면? > 6개 이상의 바둑알이 놓여있다는 뜻!
그러므로 다음 바둑알을 탐색하기 위해
break문을 걸어 while 문을 빠져 나온다.
이 부분만 체크하면 안되고,
한 군데 더 체크 해야 한다.
nx,ny에서 현재 방향으로 한 칸 더 나아갔을 때
그 위치에 마찬가지로 color와 같은 값이 있으면
> 6개 이상의 바둑알이 놓여있다는 뜻이다.
이때, indexError를 조심해야 한다 ㅎ..
격자 밖을 벗어나는 지 꼭 확인해줄 것!
sys.exit(0)도 유용하다는 걸 깨닫게 된 순간!
sys.exit(0)을 하게 되면
바로 디버깅 종료되니까,
매우 편하다!
조잡스러운 실패작.. 나의 코드
(저장 용도)
'''
import sys
sys.setrecursionlimit(100000)
array = [[None] for _ in range(19)]
for i in range(19):
array[i] = list(map(int, input().split()))
# 우상,우,우하,하
dx = [-1, 0, 1, 1]
dy = [1, 1, 1, 0]
def index_find(row, col, num):
for i in range(4):
nx = row + dx[i]
ny = col + dy[i]
cnt = 1
if array[nx][ny] == 0 or array[nx][ny] != array[row][col]:
continue
else: # 만약 같은 숫자가 있을 경우!
while True:
if cnt == 5: # 연속된 숫자가 5개일 경우
if array[row - dx[i]][col - dy[i]] == array[row][col] or array[nx + dx[i]][ny + dy[i]] == \
array[row][
col]: # 5개 이상일 경우 반복문 종료
break
else: # 5개일 경우 해당 숫자(검 or 흰)와 위치 반환
return num, nx - dx[i] * 5, ny - dy[i] * 5
elif cnt < 5: # 연속된 숫자가 5개 미만일 경우
cnt += 1
if array[nx][ny] == 0 or array[nx][ny] != array[row][col]: # 연속이 끊기면 반복문 종료
break
nx = nx + dx[i]
ny = ny + dy[i]
else:
return 0, None, None
return 0, None, None
state = False
for i in range(19):
for j in range(19):
if array[i][j] != 0:
answer = list(index_find(i, j, array[i][j]))
if answer.count(None) == 0: # 만약 검 or 흰이 이겼을 경우
state = True
break
if state:
break
print(answer[0]) # 검(1) or 흰(2) or 아무도 이긴 사람이 없을 때 (0)
if answer.count(None) == 0: # 이긴 사람이 있을 경우 위치 출력
for i in range(1, len(answer)):
print(answer[i] + 1, end=' ')
'''
'여니의 취준 준비 > 코딩테스트 (Python)' 카테고리의 다른 글
[n17276] 배열 돌리기 (in python) (0) | 2021.05.29 |
---|---|
[n16926] 배열 돌리기 (python) (0) | 2021.05.26 |
[n17413] 단어 뒤집기 2 (in python) (0) | 2021.05.25 |
[n20436] ZOAC 3 in python (0) | 2021.05.21 |
[n20291] 파일 정리 (0) | 2021.05.21 |