성장일기
[python] 백준 2615 - 오목 본문
https://www.acmicpc.net/problem/2615
🧨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 |