[코딩테스트][백준] 🔥 백준 14891번, 15662번 "톱니바퀴" 문제: Python으로 완벽 해결하기! 🔥

김상욱·2024년 7월 30일
0
post-thumbnail

문제 링크

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

🕒 Python 14891번 풀이시간: 20분

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)

🕒 Python 15662번 풀이시간: 20분

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로 기록하고 해당 방향에 따라 최종적으로 회전 시켜주면 된다.

마지막으로 해당 바퀴에 따른 점수가 맨 앞칸의 점수의 기준으로 2k2^k의 형태를 띄무로 이를 더해주면 된다.

이렇게 Python으로 백준의 "톱니바퀴" 문제를 해결해보았습니다. 코드와 개념 설명을 참고하여 문제를 해결하는 데 도움이 되셨길 바랍니다! 😊

0개의 댓글