15662: 톱니바퀴 (2)

ewillwin·2023년 8월 1일
0

Problem Solving (BOJ)

목록 보기
160/230

풀이 시간

  • 19m

구현 방식

  • 재귀를 이용해서 left, right 함수를 구현해주면 된다
    -> 왼쪽 끝(left 함수)을 넘거나 오른쪽 끝(right 함수)을 넘는 경우 return
    -> 두 톱니바퀴가 맞닿은 부분이 같다면 return
    -> 두 톱니바퀴가 맞닿은 부분이 다르다면 재귀호출 후 현재 톱니 회전

  • 1차원 회전의 경우 deque의 rotate 메소드를 사용하면 편하다


코드

import sys
from collections import deque


def left(index, direction):
    if index < 0:
        return
    if Gears[index][2] == Gears[index+1][6]:
        return
    if Gears[index][2] != Gears[index+1][6]:
        left(index-1, -direction)
        Gears[index].rotate(-direction)

def right(index, direction):
    if index > T-1:
        return
    if Gears[index][6] == Gears[index-1][2]:
        return
    if Gears[index][6] != Gears[index-1][2]:
        right(index+1, -direction)
        Gears[index].rotate(-direction)

T = int(sys.stdin.readline()[:-1])
Gears = []
for t in range(T):
    Gears.append(deque(list(map(int, list(sys.stdin.readline()[:-1])))))

K = int(sys.stdin.readline()[:-1])
method = []
for k in range(K):
    tmp = list(map(int, sys.stdin.readline()[:-1].split()))
    method.append((tmp[0]-1, tmp[1]))

for k in range(K):
    index, direction = method[k]
    left(index - 1, direction)
    right(index + 1, direction)
    Gears[index].rotate(direction)

result = 0
for gear in Gears:
    if gear[0] == 1:
        result += 1
print(result)

결과

profile
Software Engineer @ LG Electronics

0개의 댓글