개발조아

[BOJ/백준] 14891 톱니바퀴 파이썬 본문

알고리즘/백준

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

개발조아 2021. 9. 9. 13:41
728x90

문제 링크 : https://www.acmicpc.net/problem/14891

 

14891번: 톱니바퀴

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

www.acmicpc.net

 

구현, 시뮬레이션 문제이다. 보통 이런 시뮬레이션 문제는 문제에서 하라는대로만 하면 잘맞긴했다. 근데 그게 어려울뿐...

 

문제는 톱니바퀴를 하나 회전했을 때 주변 톱니바퀴의 상태에 따라 같이 회전한다.

주어진 입력대로 다 회전후 모든 톱니바퀴의 상태에 따라 점수를 계산하라 이다.

 

회전을 시작하는 톱니바퀴는 좌우 톱니바퀴를 확인한다.

주변 톱니바퀴는 한쪽 방향만 확인하면 된다.

 

from sys import stdin
from collections import deque

input = stdin.readline

gears = []
for _ in range(4):
    gears.append(list(input().strip()))

k = int(input())
order = []
for _ in range(k):
    num,dir = map(int, input().split())
    order.append((num-1,dir))

def solv():
    simul()
    print(calc_answer())

def calc_answer():
    op = 0
    answer = 0
    for gear in gears:
        if gear[0] == '1':
            answer += 2**op
        op += 1
    return answer
def simul():
    for num, dir in order:
        q = deque()
        if is_roate(num,1):
            q.appendleft((num+1,-dir,1))
        if is_roate(num,-1):
            q.appendleft((num-1,-dir,-1))
        rotate_gear(num,dir)
        while q:
            now,r,d = q.pop()
            if now < 0 or now >= 4:
                continue
            if is_roate(now, d):
                q.appendleft((now+d,-r,d))
            rotate_gear(now, r)

def is_roate(num,d):
    nxt = num+d
    if d == 1:
        if nxt >= 4 or gears[num][2] == gears[nxt][6]:
            return False
        else:
            return True
    else:
        if nxt < 0 or gears[num][6] == gears[nxt][2]:
            return False
        else:
            return True

def rotate_gear(num,r):
    global gears
    if r == 1:
        gears[num] = gears[num][-1:]+gears[num][:-1]
    else:
        gears[num] = gears[num][1:]+gears[num][:1]
solv()

 

Comments