Algorithm/Implementation

[백준 15662번] 톱니바퀴(2)

킹우현 2023. 8. 9. 02:36

t = int(input())

gear = [[0]*8 for _ in range(t)]
rotate_list = []

answer = 0

for i in range(t):
    gear[i] = list(map(int,list(input())))

def rotate_right(lst): # 시계 방향으로 회전시키는 함수
    lst.insert(0,lst.pop())

def rotate_left(lst): # 반시계 방향으로 회전시키는 함수
    lst.append(lst.pop(0))    

k = int(input())

for i in range(k): # 회전 목록 입력받고 저장
    number, direction = map(int,input().split())
    rotate_list.append((number-1,direction,"both"))

def rotate(index,d): # 주어진 방향으로 회전시키는 함수
    if d == 1:
        rotate_right(gear[index])
    elif d == -1:
        rotate_left(gear[index])

def propagation(n,direct,prop_direct): # 회전 전파시키는 함수

    if prop_direct == "both": # 회전 전파 방향이 양쪽 일때
        if n - 1 >= 0 and gear[n][6] != gear[n-1][2]: # 서로 극이 다른 경우 왼쪽으로 전파(재귀방식)
            propagation(n-1,-direct,"left")
            
        if n + 1 < t and gear[n][2] != gear[n+1][6]: # 서로 극이 다른 경우 오른쪽으로 전파(재귀방식)
            propagation(n+1,-direct,"right")
        
    elif prop_direct == "left": # 회전 전파 방향이 왼쪽 일때
        if n - 1 >= 0 and gear[n][6] != gear[n-1][2]: # 서로 극이 다른 경우 왼쪽으로 전파(재귀방식)
            propagation(n-1,-direct,"left")

    elif prop_direct == "right": # 회전 전파 방향이 오른쪽 일때
        if n + 1 < t and gear[n][2] != gear[n+1][6]: # 서로 극이 다른 경우 오른쪽으로 전파(재귀방식)
            propagation(n+1,-direct,"right")

    rotate(n,direct) # 회전

for gear_index,rotate_d, rotate_prop in rotate_list:
    propagation(gear_index,rotate_d,rotate_prop)

for i in range(t): # 점수 계산
    if gear[i][0] == 1:
        answer += 1

print(answer)

이번 문제는 바로 이전에 풀이했던 톱니바퀴 문제(https://woohyun-king.tistory.com/200)와 거의 유사한 문제이다.(구체적인 문제풀이를 참고하고자 한다면 해당 링크를 참고하길 바란다.)

 

다만 톱니바퀴의 개수가 4개가 아니라 임의의 값 T개를 가진다는 점과, 점수 계산방법이 조금 다르다는 차이점이 존재하는데, 로직 상으로는 완전히 동일하다.

 

이전에 톱니바퀴 문제를 풀이했을 때 4개의 톱니바퀴를 각각 비교하면서 구현하는 하드코딩 방식이 아니라, 재귀함수를 사용하여 풀이하였더니 톱니바퀴의 개수만 수정하여 간단하게 풀이할 수 있었다 :)