여니의 취준 준비/코딩테스트 (Python)

[n2615] 오목 (in python)

여니's 2021. 5. 26. 18:52

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=' ')

'''