백준(삼성) - 톱니바퀴(14891)

marafo·2021년 4월 15일
0

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

import sys
from collections import deque

def checkRight(start, dirs):
    if (start > 4) or gears[start - 1][2] == gears[start]:
        return
    
    if gears[start - 1][2] != gears[start][6]:
        checkRight(start + 1, -dirs)
        gears[start].rotate(dirs)
        
def checkLeft(start, dirs):
    if start < 1 or gears[start][2] == gears[start + 1][6]:
        return # 가장 왼쪽 톱니 바퀴이거나 오른쪽 톱니바퀴와 맞닿는 부분의 극이 같을 때
    
    if gears[start + 1][6] != gears[start][2]:
        checkLeft(start - 1, -dirs) # 왼쪽 톱니 체크할 때 현 톱니의 반대 방향으로 회전
        gears[start].rotate(dirs) # 넘겨 받은 dirs로 rotate 메서드 회전한다.
        
gears = {}

for i in range(1, 5): # 4개 톱니바퀴 상태
    gears[i] = deque(list(map(int, list(sys.stdin.readline().replace("\n", "")))))
    # gears[i] = deque([1, 0, 1, 0, 1, 1, 1, 1]), gears[i + 1] = ...
    # gears = {i : deque([1, 0, 1, 0, 1, 1, 1, 1]), ...}
n = int(sys.stdin.readline())

for i in range(n):
    num, dirs = map(int, sys.stdin.readline().split())
    checkRight(num + 1, -dirs)
    checkLeft(num - 1, -dirs)
    gears[num].rotate(dirs)
    
result = 0
for i in range(4):
    result += (2 ** i) * gears[i + 1][0] 
    # 인덱스 0번째가 12시 방향
    # 인덱스 커질수록 1, 2, 4, 8처럼 2배 지수
print(result)

rotate 메서드 활용


참고)
큐 없이 회전 직접 구현 : https://pacific-ocean.tistory.com/369
큐 자체에 있는 회전 활용 : https://inspirit941.tistory.com/entry/Python-백준-14891-톱니바퀴

profile
프론트 개발자 준비

0개의 댓글