yha97 2023. 6. 16. 10:19

날짜 : 2023. 06. 16

사용 언어 : python

 

문제

https://www.acmicpc.net/problem/14891

 

 

코드

import sys
from collections import deque

def turn(now, dir, goto):  # 기준 노드, 회전방향, 진행방향(-1 : 좌 / 0 : 기준 / 1 : 우)
    # 좌 , 우 회전여부 체크
    if goto in (0, -1) and now > 0:  # 기존 왼쪽으로 진행, 범위 포함
        if gear[now - 1][2] != gear[now][6]:  # 서로 극이 다름 => 회전 가능
            turn(now-1, dir * (-1), -1)  # 왼쪽으로 진행(회전 방향은 반대로)
    if goto in (0, 1) and now < 3:  # 기존 오른쪽으로 진행, 범위 포함
        if gear[now + 1][6] != gear[now][2]:  # 서로 극이 다름 => 회전 가능
            turn(now+1, dir * (-1), 1)  # 오른쪽으로 진행
    # 회전
    if dir == 1: # 시계방향 회전
        t = gear[now].pop()
        gear[now].appendleft(t)
    elif dir == -1:  # 반시계방향 회전
        t = gear[now].popleft()
        gear[now].append(t)
    return


gear = list()
for _ in range(4):
    a = ' '.join(sys.stdin.readline().rstrip()).split()
    tmp = deque()  # 톱니바퀴 하나 -> 데크로 지정
    for i in a:
        tmp.append(i)
    gear.append(tmp)  # 톱니바퀴 입력
# for i in gear: print(i)

k = int(sys.stdin.readline())  # 회전 횟수
for _ in range(k):
    idx, dir = map(int, sys.stdin.readline().split())  # 회전시킨 톱니바퀴 번호
    turn(idx-1, dir, 0)
    # for i in gear:
    #     print(i)

res = 0
for i in range(4):
    if gear[i][0] == '1':
        res += (2 ** i)
print(res)

 

 

풀이

- 스터디에서 풀었던 톱니바뮈(2) (https://www.acmicpc.net/problem/15662) 문제와 동일한 것 같은 문제였다.

- 기어 각각을 데크로 입력받고, 조건에 따라 회전타겟을 재귀로 돌리고, 기준노드(goto가 0)에서 가장 바깥부터 회전 후 함수를 탈출하는 방식으로 구현한다.

- 현재 체크하는 기어가 now 라고 했을 때, 오른쪽 기어의 극을 비교하는 것은 now[2]와 now의 오른쪽 기어[6]과 비교하고, 왼쪽은 이와 반대이다.

- 회전의 경우에도 시계방향, 반시계 방향으로 나누어 데크를 활용해 풀이한다.

 

알게된 점

- 한번 풀어봤던 문제랑 아주 유사했기 때문에 크게 어렵지 않았다.

- 다만 인덱스 입력받고 적용하는 과정에서 1번 기어부터 시작했기 때문에 마지막에 이를 수정했고, 통과했다.

- 지난번엔 실버였던 것 같은데 지금은 왜 골드인지는 잘 모르겠다.

 

참고 사이트