알고리즘 스터디

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

문제

 

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

 

14891번: 톱니바퀴

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

www.acmicpc.net


풀이

 

구현문제였다. 큰 어려움 없이 풀었다.

deque에 rotate 함수가 있어 구현이 쉬웠다. +1을 인자로 넣으면 시계방향, -1을 넣으면 반시계방향으로 회전된다.

from collections import deque
import sys

gears = [deque(list(map(int, sys.stdin.readline().strip()))) for _ in range(4)]
gears.insert(0, [])  # 톱니바퀴 번호 인덱스를 맞추기 위해

n = int(input())
rotate = [list(map(int, input().split())) for _ in range(n)]


def rleft(gearnum, dirc, l):
    if gearnum != 1:
        if l != gears[gearnum - 1][2]:  # 서로 다른 극이었다면
            ll = gears[gearnum-1][6]
            gears[gearnum-1].rotate(dirc*(-1))
            rleft(gearnum - 1, dirc * (-1), ll)  # 왼쪽 톱니바퀴를 반대방향으로 돌림


def rright(gearnum, dirc, r):
    if gearnum != 4:
        if r != gears[gearnum + 1][6]:  # 서로 다른 극이었다면
            rr = gears[gearnum+1][2]
            gears[gearnum+1].rotate(dirc*(-1))
            rright(gearnum+1, dirc * (-1), rr)  # 오른쪽 톱니바퀴를 반대방향으로 돌림

for r in rotate:
    l = gears[r[0]][6]
    ri = gears[r[0]][2]
    gears[r[0]].rotate(r[1])
    rleft(r[0], r[1], l)
    rright(r[0], r[1], ri)

answer = 0
for i in range(1, 5):
    answer += gears[i][0]*(2**(i-1))

print(answer)