14891번: 톱니바퀴

첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터

www.acmicpc.net

 

# 현재 기어에서 왼쪽이나 오른쪽 기어 회전 여부
def is_spin(num, d):
    left, right = 0, 0
    if num == 1: # 가장 왼쪽 기어라면
        if gear[num][2] != gear[num+1][-2]: # 오른쪽만 확인
            right = d * -1 # 회전 방향은 반대
        return left, right
        
    elif num == 4: # 가장 오른쪽 기어라면
        if gear[num][-2] != gear[num-1][2]: # 왼쪽만 확인
            left = d * -1
        return left, right
    
    else: # 중간에 있는 기어는 양쪽 모두 확인
        if gear[num][2] != gear[num+1][-2]:
            right = d * -1
        if gear[num][-2] != gear[num-1][2]:
            left = d * -1
        return left, right
    
# 전체 기어 중 회전해야 하는 기어 확인
def spin_gear(num, d):
    global spin
	
    # 처음 회전시키는 기어 양 옆 확인
    left, right = is_spin(num, d)

	# 왼쪽 기어를 회전 시켜야 한다면 
    if left and spin[num-1] == 0:
        spin[num-1] = left # 왼쪽 기어 회전 방향 저장
        spin_gear(num-1, left) # 왼쪽 기어에서 다음 기어 확인

	# 오른쪽 기어를 회전 시켜야 한다면 상동
    if right and spin[num+1] == 0:
        spin[num+1] = right
        spin_gear(num+1, right)


A = list(input()) # 0: N, 1: S
B = list(input())
C = list(input())
D = list(input())

K = int(input()) # 1: clock, -1: counter clock
spins = [list(map(int, input().split())) for _ in range(K)]
gear = {1: A, 2: B, 3: C, 4: D}


for g, d in spins:
    spin = [0 for _ in range(5)]
    
    spin_gear(g, d) # 회전시켜야 하는 기어 확인
    spin[g] = d # 처음 회전 시키는 기어 회전
    for idx, s in enumerate(spin[1:], 1):
        if s == 1: # 시계 방향
            gear[idx] = [gear[idx][-1]] + gear[idx][:-1]
        elif s == -1: # 반시계 방향
            gear[idx] = gear[idx][1:] + [gear[idx][0]]

print(int(''.join(gear[i][0] for i in range(4, 0, -1)), base=2))​

'알고리즘 > 백준' 카테고리의 다른 글

[백준 파이썬] 15685 드래곤 커브  (0) 2023.07.28
[백준 파이썬] 15683 감시  (0) 2023.07.27
[백준 파이썬] 14503 로봇 청소기  (0) 2023.07.21
[백준 파이썬] 4179 불!  (0) 2023.07.20
[백준 파이썬] 14501 퇴사  (0) 2023.07.20

+ Recent posts