여니의 취준 준비/코딩테스트 (Python)

[14891] 톱니바퀴 in python

여니's 2022. 2. 20. 20:56

 

 

> 구현

> 시뮬레이션

 

 

처음에는

회전하는 톱니바퀴의 번호에 따라

연산을 다르게 해야 하는 줄 알았다.

 

그래서 회전하는 톱니바퀴가 1번이면 

오른쪽만 쭉 확인하고

 

4번이면

왼쪽 톱니바퀴만 확인하고

 

둘다 아니면

왼쪽 오른쪽 모두 확인을 해야하는데

 

이렇게 하게 되면 

연산이 너무 복잡해질 것 같아서

다른 방법을 강구해보았다

 

 

 

최종적으로 생각한 방법은

해당 톱니바퀴의 왼쪽과 오른쪽을 각각 확인하는 거다

회전하는 톱니바퀴의 번호에 따라 나누지않고!

 

회전하는 해당 톱니바퀴의 왼쪽에 있는 톱니바퀴를 회전시킨다.

오른쪽에 있는 톱니바퀴를 회전시킨다. 

재귀함수를 이용해서 왼쪽, 오른쪽에 있는 톱니바퀴를 탐색한다.

 

 

from collections import deque

gear = [deque(map(int, input())) for _ in range(4)]
k = int(input())
array = [deque(list(map(int, input().split()))) for _ in range(k)]


def left(num, dir):
    if num < 0:
        return
    if gear[num + 1][6] != gear[num][2]:
        left(num-1,-dir) # 왼쪽의 왼쪽 톱니바퀴 계속 확인
        gear[num].rotate(dir) # 왼쪽 톱니바퀴 회전시키기


def right(num, dir):
    if num > 3:
        return
    if gear[num - 1][2] != gear[num][6]:
        right(num+1,-dir) # 오른쪽의 오른쪽 톱니바퀴 계속 확인
        gear[num].rotate(dir) # 오른쪽 톱니바퀴 회전시키기


for i in range(k):
    rnum, rdir = array[i]
    rnum -= 1
    left(rnum - 1, -rdir)  # 왼쪽 톱니바퀴 변경
    right(rnum + 1, -rdir)  # 오른쪽 톱니바퀴 변경
    gear[rnum].rotate(rdir) # 해당 톱니바퀴 변경

answer = 0
if gear[0][0] == 1:  # s극
    answer += 1
if gear[1][0] == 1:
    answer += 2
if gear[2][0] == 1:
    answer += 4
if gear[3][0] == 1:
    answer += 8
print(answer)