문제풀이/구현

● [파이썬] [구현] 백준 14891 톱니바퀴

승무_ 2023. 3. 18. 14:27

문제

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

 

14891번: 톱니바퀴

총 8개의 톱니를 가지고 있는 톱니바퀴 4개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴

www.acmicpc.net

코드

from collections import deque

# appendleft 사용하기 위해 deque사용
array=[deque(map(int, list(input().strip()))) for _ in range(4)]

def cal():
    result=0
    for i in range(4):
        if array[i][0]==1:
            # 2의 제곱
            result+=(2**i)
    print(result)

# 맨 앞을 빼고, 그것을 맨 뒤에 넣기
def turnL(i):
    temp=array[i].popleft()
    array[i].append(temp)

# 맨 뒤를 빼고, 그것을 맨 앞에 넣기
def turnR(i):
    temp=array[i].pop()
    array[i].appendleft(temp)

def search(num,dir):
    # 동시에 바뀌므로 dp에 방향을 저장
    dp[num]=dir
    if visited[num]==False:
        if num>0:
            if array[num-1][2]!=array[num][6] and visited[num-1]==False:
                visited[num]=True
                search(num-1,dir*-1)
        if num<3:
            if array[num][2]!=array[num+1][6] and visited[num+1]==False:
                visited[num]=True
                search(num+1,dir*-1)

k=int(input())
for _ in range(k):
    dp=[0]*4
    visited=[False]*4
    num,dir=map(int, input().split())
    search(num-1,dir)
    for i in range(4):
        if dp[i]==1:
            turnR(i)
        elif dp[i]==-1:
            turnL(i)
cal()

어려웠던 부분

연쇄적으로 회전하는 부분을 bfs를 통해 해결하였고, 동시에 돌아가는 부분은 dp에 방향을 따로 저장 해뒀다가 search가 끝나고 동시에 회전 시켰다.