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 |