전공/백준
14891
yha97
2023. 6. 16. 10:19
날짜 : 2023. 06. 16
사용 언어 : python
문제
코드
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번 기어부터 시작했기 때문에 마지막에 이를 수정했고, 통과했다.
- 지난번엔 실버였던 것 같은데 지금은 왜 골드인지는 잘 모르겠다.
참고 사이트
-