성장일기

[python] 백준 2615 - 오목 본문

알고리즘 문제

[python] 백준 2615 - 오목

김몽몽 2022. 2. 21. 17:23

https://www.acmicpc.net/problem/2615

 

2615번: 오목

오목은 바둑판에 검은 바둑알과 흰 바둑알을 교대로 놓아서 겨루는 게임이다. 바둑판에는 19개의 가로줄과 19개의 세로줄이 그려져 있는데 가로줄은 위에서부터 아래로 1번, 2번, ... ,19번의 번호

www.acmicpc.net

🧨19 * 19의 오목판에

검은 바둑알은 1, 흰 바둑알은 2로 표시된다.

검은 바둑알이 이겼을 경우 1, 흰 바둑알이 이겼을 경우 2,

승부가 결정나지 않았을 경우 0을 출력

다섯 개의 바둑알 중에서 가장 왼쪽에 있는 바둑알을 출력!

위 조건을 못봐서 한참 헤메었다.

 

육목은 X →

같은방향의 위, 아래 돌을 확인해줘야 함위에서부터 열방향으로 탐색하기 때문에 왼쪽 아래, 아래, 오른쪽 아래, 오른쪽만 탐색해주면 됨

arr = [[0] * 21]+[[0]+list(map(int, input().split()))+[0] for _ in range(19)] + [[0] * 21] #받아오기
# 테두리 두르기
#pprint(arr)
dr = [1,1,1,0]  #위에서 부터 훑어오니까 좌아래, 아래, 우아래, 옆만 보면 됨   
dc = [-1,0,1,1]

def solution(arr):
    for r in range(1,20):
        for c in range(1,20):
            if arr[r][c] == 1 or arr[r][c] == 2: # 검은돌이거나 흰돌일 때
                for i in range(4):  # 네 방향을 확인
                    idx_r = r + dr[i]
                    idx_c = c + dc[i]
                    cnt = 1

                    left_idx=[r,c]
                    if arr[r][c] == arr[idx_r][idx_c]: #같은색 돌이 있으면
                        cnt += 1  # 카운트 늘려줌
                        check = True
                        while check: # 같은 방향으로 쭉
                            if 0 <= idx_r <= 20 and 0 <= idx_c <= 20 and arr[idx_r+dr[i]][idx_c+dc[i]] == arr[idx_r][idx_c]:
                                idx_r = idx_r + dr[i]
                                idx_c = idx_c + dc[i]
                                cnt += 1
                                if idx_c < left_idx[1]:
                                    left_idx = [idx_r,idx_c]
                            if 0 <= idx_r <= 20 and 0 <= idx_c <= 20 and cnt == 5 and arr[idx_r+dr[i]][idx_c+dc[i]] == arr[idx_r][idx_c]:
                                check = False  # 5개인데 아래 육목인 경우
                                break
                            if 0 <= r-1 <= 20 and 0 <= c-1 <= 20 and cnt == 5 and arr[r-dr[i]][c-dc[i]] == arr[r][c]:
                                check = False  # 윗쪽 육목인 경우
                                break
                            if 0 <= idx_r <= 20 and 0 <= idx_c <= 20 and cnt == 5:
                                return (arr[r][c], left_idx[0], left_idx[1])  # 오목인 경우 
                            if 0 <= idx_r <= 20 and 0 <= idx_c <= 20 and arr[idx_r+dr[i]][idx_c+dc[i]] != arr[idx_r][idx_c]:
                                check = False
                                break
    return 0,0,0

win, R, C = solution(arr)
if win == 0:
    print(0)
else:
    print(win)
    print(R, C)

 

'알고리즘 문제' 카테고리의 다른 글

[python] 백준 2110 - 공유기 설치  (0) 2022.02.21
골드 4 😥  (0) 2022.02.07
[python] 백준 17299 - 오등큰수  (0) 2022.02.07
[python] 백준 1874 - 스택 수열  (0) 2022.02.04
[python] 백준 6064 - 카잉 달력  (0) 2022.01.26