Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 그래프 이론
- GROUP BY
- 트리
- BFS
- 다시
- 브루트포스
- MST
- DP
- 그리디
- DFS
- 다익스트라
- 해시
- 서브쿼리
- 수학
- 다이나믹프로그래밍
- 자료구조
- 에라토스테네스의 체
- 재귀
- 그래프 탐색
- 누적합
- 크루스칼
- 플로이드-워셜
- 백트래킹
- 우선순위큐
- 투포인터
- 다이나믹 프로그래밍
- join
- 시뮬레이션
- 분할정복
- 구현
Archives
- Today
- Total
기록하고 까먹지 말기
14891 본문
날짜 : 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번 기어부터 시작했기 때문에 마지막에 이를 수정했고, 통과했다.
- 지난번엔 실버였던 것 같은데 지금은 왜 골드인지는 잘 모르겠다.
참고 사이트
-