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()를 하는 이유도 이 순서가 바뀌면 톱니바퀴 회전 후에 재귀를 호출하기 때문에 재귀 과정에서 서로 다른 톱니바퀴끼리 극을 비교할때 문제가 될 수 있다.
안녕하세요 좋은 코드 잘보고 갑니다! 주석을 자세하게 잘 달아 놓으셔서 이해하기 좋았어요!!
혹시 저희 알고리즘 스터디하는데 학습 자료로 올려주신 코드 이용해도 될까요?? 출처 표기하겠습니다!!