[백준 삼성기출 X] 톱니바퀴(python)

이진규·2022년 8월 4일
1

백준(PYTHON)

목록 보기
65/115

문제

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

나의 코드

"""

"""

from collections import deque
from sys import stdin
input = stdin.readline

wheel = [0] + [ deque(map(int, input().rstrip())) for _ in range(4) ] # 인덱스 1부터 12시방향부터 시계방향, N극 : 0 S극 : 1
k = int(input()) # 회전시킨 횟수
rotate = [ list(map(int, input().split())) for _ in range(k) ] # [ 톱니바퀴 번호, 회전 방향(시계방향 : 1, 반시계방향 : -1) ]

def rotate_right(x, dir): # 시계 방향으로 회전
    if x > 4 or wheel[x-1][2] == wheel[x][6]: # 범위를 벗어나거나 왼쪽 톱니바퀴와 극이 같은 경우 return
        return

    if wheel[x-1][2] != wheel[x][6]: # 왼쪽 톱니바퀴와 극이 다른경우 재귀를 돌리고 시계방향으로 회전해준다.
        rotate_right(x+1, -dir)
        wheel[x].rotate(dir)


def rotate_left(x, dir): # 반시계 방향으로 회전
    if x < 1 or wheel[x][2] == wheel[x+1][6]: # 범위를 벗어나거나 오른쪽 톱니바퀴와 극이 같은 경우 return
        return

    if wheel[x][2] != wheel[x+1][6]: # 오른쪽 톱니바퀴와 극이 다른경우 재귀를 돌리고 반시계방향으로 회전해준다.
        rotate_left(x-1, -dir)
        wheel[x].rotate(dir)


for num, dir in rotate:

    # 함수를 호출할 때 '-'를 해주는 이유는 극이 다른 경우 방향이 반대가 되기 때문임.
    # deque의 rotate(x)는 x가 양수인 경우 시계방향으로, x가 음수인 경우 반시계방향으로 회전한다.
    rotate_right(num+1, -dir)
    rotate_left(num-1, -dir)
    wheel[num].rotate(dir)


answer = 0
for i in range(1, len(wheel)):
    if wheel[i][0] == 1: # 12시 방향이 S극이면
        answer += 2 ** (i-1)
print(answer)
    

설명

파이썬 deque자료형의 rotate()를 생각해낼줄 알아야 하고, 재귀에 대한 이해가 있어야 풀 수 있다.

함수 내에서 재귀 호출 후 rotate()를 하는 이유도 이 순서가 바뀌면 톱니바퀴 회전 후에 재귀를 호출하기 때문에 재귀 과정에서 서로 다른 톱니바퀴끼리 극을 비교할때 문제가 될 수 있다.

참고 자료

profile
항상 궁금해하고 공부하고 기록하자.

1개의 댓글

comment-user-thumbnail
2022년 9월 14일

안녕하세요 좋은 코드 잘보고 갑니다! 주석을 자세하게 잘 달아 놓으셔서 이해하기 좋았어요!!
혹시 저희 알고리즘 스터디하는데 학습 자료로 올려주신 코드 이용해도 될까요?? 출처 표기하겠습니다!!

답글 달기