https://www.acmicpc.net/problem/15662
총 8개의 톱니를 가지고 있는 톱니바퀴 T개가 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다.
톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴가 1번, 그 오른쪽은 2번, ..., 가장 오른쪽 톱니바퀴는 T번이다.
톱니바퀴를 총 K번 회전시키려고 한다. 톱니바퀴의 회전은 한 칸 기준. 회전은 시계 방향과 반시계 방향.
톱니바퀴를 회전시키려면, 회전시킬 톱니바퀴와 회전시킬 방향을 결정해야 한다. 톱니바퀴가 회전할 때, 서로 맞닿은 극에 따라서 옆에 있는 톱니바퀴를 회전시킬 수도 있고, 회전시키지 않을 수도 있다. 톱니바퀴 A를 회전할 때, 그 옆에 있는 톱니바퀴 B와 서로 맞닿은 톱니의 극이 다르다면, B는 A가 회전한 방향과 반대방향으로 회전하게 된다.
톱니바퀴 T개의 초기 상태와 톱니바퀴를 회전시킨 방법이 주어졌을 때, 최종 톱니바퀴의 상태를 구하는 프로그램
(입력 및 선언)
(왼쪽 톱니바퀴 조사)
(오른쪽 톱니바퀴 조사)
(최종 출력)
from collections import deque
wheel = []
cnt = 0
def left(start, dirs):
if start < 0:
return
if wheel[start][2] != wheel[start+1][6]:
left(start-1, -dirs)
wheel[start].rotate(dirs)
def right(start, dirs):
if start > t - 1:
return
if wheel[start][6] != wheel[start-1][2]:
right(start+1, -dirs)
wheel[start].rotate(dirs)
t = int(input())
for _ in range(t):
wheel.append(deque(input()))
k = int(input())
for _ in range(k):
num, dir = map(int, input().split())
num -= 1
left(num-1, -dir)
right(num+1, -dir)
wheel[num].rotate(dir)
for i in range(t):
if wheel[i][0] == '1':
cnt += 1
print(cnt)
톱니바퀴 1 문제와 다르게 톱니바퀴 개수를 입력받는 문제였다.
따라서 right() 함수를 구현할 때 인덱스 범위를 잘 설정해주어야 IndexError가 나지 않는다.
좋은 글 잘 읽었습니다, 감사합니다.