Algorithm/Implementation

[백준 14891번] 톱니바퀴

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

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

score = 0

for i in range(4):
    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 < 4 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 < 4 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(4): # 점수 계산
    if i == 0 and gear[i][0] == 1:
        score += 1
    elif i == 1 and gear[i][0] == 1:
        score += 2
    elif i == 2 and gear[i][0] == 1:
        score += 4
    elif i == 3 and gear[i][0] == 1:
        score += 8

print(score)

d이번 문제는 '회전시킬 톱니바퀴 번호'와 '회전시킬 방향(시계/반시계)'이 주어졌을 때, 서로 맞닿은 극이 다를 경우에는 반대 방향으로 회전시키는 방식으로 진행했을 때 최종적인 톱니바퀴의 상태를 구하는 문제이다.

 

처음에는 톱니바퀴의 상태를 2차원 배열로 저장하려고 했었는데, 생각해보니 굳이 2차원 배열로 저장하지 않고 1차원 배열로도 충분히 맞닿는 극(index 2index 7)을 비교할 수 있다는 것을 인지하고 풀이방식을 다르게 접근하였다.

 

하지만 여기서 문제는 처음에 회전을 시킬 때는 해당 톱니바퀴의 회전이 양쪽에 있는 톱니바퀴에 영향을 주지만, 맞물려서 회전한 톱니바퀴는 맞물린 방향으로만 회전을 시켜야한다는 것이다.

 

따라서 회전을 전파시키는 방향을 양쪽(both), 왼쪽(left), 오른쪽(right)로 구분하여 prop_direct 매개변수에 전달해주었고, 이를 재귀함수를 사용하여 모든 톱니바퀴에 적용한 뒤 최종적으로 톱니바퀴를 회전시켜주는 방식으로 풀이하였다.

 

아이디어를 떠올리는데는 시간이 오래걸렸지만, 톱니바퀴를 회전시키는 로직과 회전을 전파시키는 함수를 따로 구분지어서 깔끔하게 해결할 수 있었던 문제였다 :)

 

'Algorithm > Implementation' 카테고리의 다른 글

[백준 14503번] 로봇 청소기  (0) 2023.08.09
[백준 15662번] 톱니바퀴(2)  (0) 2023.08.09
[백준 3190번] 뱀  (0) 2023.08.06
[백준 21608번] 상어 초등학교  (0) 2023.07.31
[프로그래머스] 연속된 수의 합  (0) 2023.07.23