백준 python 기록
백준 파이썬 14891 톱니바퀴
우히힝
2022. 4. 11. 03:05
https://www.acmicpc.net/problem/14891
14891번: 톱니바퀴
총 8개의 톱니를 가지고 있는 톱니바퀴 4개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴
www.acmicpc.net
간만에 정말 재밌게 풀었던 문제였습니다.
기본적으로 DFS를 사용해서 문제풀이를 진행하였습니다.
target과 direction을 정하고나서
해당 target에 연관된 모든 톱니바퀴를 dfs를 통해서 위치변환을 마치고 마지막으로
처음 정한 target의 톱니바퀴를 변경시켜 문제풀이를 하였습니다.
from collections import deque
wheel = []
for i in range(4):
wheel.append(deque(list(map(int, input()))))
TC = int(input())
def dfs(target, direction):
visited[target] = 1
if direction == -1:
if 0 <= target - 2 and visited[target-1] == 0:
if wheel[target - 1][6] != wheel[target - 2][2]:
dfs(target - 1, 1)
wheel[target - 2].appendleft(wheel[target - 2].pop())
if target < 4 and visited[target+1] == 0:
if wheel[target - 1][2] != wheel[target][6]:
dfs(target + 1, 1)
wheel[target].appendleft(wheel[target].pop())
if direction == 1:
if 0 <= target - 2 and visited[target-1] == 0:
if wheel[target - 1][6] != wheel[target - 2][2]:
dfs(target - 1, -1)
wheel[target - 2].append(wheel[target - 2].popleft())
if target < 4 and visited[target+1] == 0:
if wheel[target - 1][2] != wheel[target][6]:
dfs(target + 1, -1)
wheel[target].append(wheel[target].popleft())
for i in range(TC):
target, direction = map(int, input().split())
visited = [0 for _ in range(5)]
dfs(target, direction)
if direction == -1:
wheel[target - 1].append(wheel[target - 1].popleft())
else:
wheel[target-1].appendleft(wheel[target-1].pop())
result = 0
for i in range(4):
if wheel[i][0] == 1:
result += 2**i
print(result)