[ BOJ / Python ] 15662번 톱니바퀴 (2)

황승환·2022년 6월 23일
0

Python

목록 보기
335/498


이번 문제는 deque의 rotate함수를 활용하여 해결하였다. 회전시킬 톱니바퀴를 기준으로 왼쪽에 해당하는 톱니바퀴들을 순회하며 맞닿는 부분의 값이 다를 경우에는 l_chain리스트에 인덱스를 담고, 아닐 경우 순회를 종료하였다. 또한 오른쪽에 해당하는 톱니바퀴들을 순회하며 맞닿는 부분의 값이 다를 경우에 r_chain리스트에 인덱스를 담고, 아닐 경우 순회를 종료하였다. 이 과정이 끝나면, l_chain과 r_chain을 각각 순회하며 rotate해주었다. 이때 방향은 매 반복마다 -1을 곱하여 반전을 주었다.

Code

from collections import deque
t = int(input())
wh = [deque(list(str(input()))) for _ in range(t)]
k = int(input())
coms = [list(map(int, input().split())) for _ in range(k)]
def rotating(num, d):
    l_chain = []
    r_chain = []
    for i in range(num, 0, -1):
        if wh[i][6] != wh[i-1][2]:
            l_chain.append(i-1)
        else:
            break
    for i in range(num, t-1):
        if wh[i][2] != wh[i+1][6]:
            r_chain.append(i+1)
        else:
            break
    wh[num].rotate(d)
    tmp_d = d
    for nxt in l_chain:
        tmp_d *= -1
        wh[nxt].rotate(tmp_d)
    tmp_d = d
    for nxt in r_chain:
        tmp_d *= -1
        wh[nxt].rotate(tmp_d)
for num, d in coms:
    visited = [False for _ in range(t)]
    rotating(num-1, d)
answer = 0
for i in range(t):
    if wh[i][0] == '1':
        answer += 1
print(answer)

profile
꾸준함을 꿈꾸는 SW 전공 학부생의 개발 일기

0개의 댓글