https://www.acmicpc.net/problem/14891
https://www.acmicpc.net/problem/15662
from collections import deque
n=4
gears=[deque(list(input())) for _ in range(n)]
oper_cnt=int(input())
opers=[tuple(map(int,input().split())) for _ in range(oper_cnt)]
for oper in opers:
num,dir=oper
move=[0]*n
move[num-1]=dir
left=num-1
while left>0 and gears[left][6]!=gears[left-1][2]:
left-=1
move[left]=-move[left+1]
right=num-1
while right<n-1 and gears[right][2]!=gears[right+1][6]:
right+=1
move[right]=-move[right-1]
for i in range(n):
if move[i]==-1:
gears[i].append(gears[i].popleft())
elif move[i]==1:
gears[i].appendleft(gears[i].pop())
score=0
for i in range(n):
if gears[i][0]=='1':
score+=2**i
print(score)
from collections import deque
t=int(input())
gears=[]
for i in range(t):
gears.append(deque(list(input())))
k=int(input())
# print(gears)
commands=[]
for _ in range(k):
num,dir=map(int,input().split())
states=deque([dir])
left=num-1
right=num-1
while left>0:
if states[0]!=0 and gears[left][6]!=gears[left-1][2]:
states.appendleft(-states[0])
else:
states.appendleft(0)
left-=1
while right<t-1:
if states[-1]!=0 and gears[right][2]!=gears[right+1][6]:
states.append(-states[-1])
else:
states.append(0)
right+=1
for i in range(t):
if states[i]==-1:
gears[i].append(gears[i].popleft())
elif states[i]==1:
gears[i].appendleft(gears[i].pop())
# print(gears)
cnt=0
for gear in gears:
if gear[0]=='1':
cnt+=1
print(cnt)
시뮬레이션의 쉬운 편의 유형으로 톱니바퀴의 각 상황을 주어주고 이를 상황에 맞춰 회전시키면 되는 문제이다. 이 때 주의해야할 점은 동시에 회전하기 때문에 회전의 유무를 판단해두고 회전시켜야 한다는 점이다.
회전을 위해 각 톱니바퀴를 Deque로 두어 앞 뒤로 빼고 넣으면서 회전을 할 수 있게 해두었고 회전의 유무를 파악하기 위해 매회차에 명령에 따라 상태를 나타낼 수 있는 톱니바퀴 수만큼의 배열을 두었다.
해당 배열의 상태를 현재 명령을 받은 톱니바퀴를 기준으로 오른쪽으로 또 왼쪽으로 진행해가면서 방향을 -1,0,1로 기록하고 해당 방향에 따라 최종적으로 회전 시켜주면 된다.
마지막으로 해당 바퀴에 따른 점수가 맨 앞칸의 점수의 기준으로 의 형태를 띄무로 이를 더해주면 된다.
이렇게 Python으로 백준의 "톱니바퀴" 문제를 해결해보았습니다. 코드와 개념 설명을 참고하여 문제를 해결하는 데 도움이 되셨길 바랍니다! 😊