-
[알고리즘] 톱니바퀴알고리즘 2024. 3. 8. 12:27728x90
문제
https://www.acmicpc.net/problem/14891
14891번: 톱니바퀴
첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터
www.acmicpc.net
풀이 팁 ( 주의점 )
1. queue에서 왼쪽이동, 오른쪽이동은 rotate() 메소드를 사용하여 간편하게 이동시킬 수 있다.
- rotate(1) 이면 오른쪽으로 1칸, rotate(-1)은 왼쪽으로 한칸
- 톱니바퀴가 원형으로 이루어져서 시계/반시계가 오른쪽/왼쪽으로 이동된다
2. 차례대로 한개씩 톱니를 움직이는게 아니라 한번에 이동 시켜야함
- 그러면 이동시킬 방향을 저장해주고 있어야 한다 ( direction 리스트 참고 )
3. queue를 이용하는데 겨룩 2, 6의 idx가 같은지 다른지를 봐야한다
코드
import sys from collections import deque q = [ deque(list(map(int,input()))) for _ in range(4) ] k = int(input()) def move_gear(gear, direct): if direct == 1: gear.rotate(1) else: gear.rotate(-1) # True 면 회전 안함 def check_gear(gear1, gear2): return gear1[2] != gear2[6] for i in range(k): which_one, direct = map(int,input().split()) which_one -= 1 direction = [0] * 4 direction[which_one] = direct # 오른쪽으로 전파 for i in range(which_one,3): if not check_gear(q[i], q[i+1]): break direction[i+1] = -direction[i] # 왼쪽으로 전파 for i in range(which_one,0,-1): if not check_gear(q[i-1], q[i]): break direction[i-1] = -direction[i] # 회전시키기 for i, val in enumerate(direction): if val != 0: move_gear(q[i], val) ans = 0 for i, val in enumerate(q): if val[0] == 1: ans += 2**i print(ans)
'알고리즘' 카테고리의 다른 글
[알고리즘] 상어 초등학교 - 구현 (0) 2024.03.11 [알고리즘] 치킨배달 - 백트래킹 (3) 2024.03.08 [알고리즘] 로봇청소기 - bfs (2) 2024.03.07 [알고리즘 팁] x=y 대칭되는 값들을 찾아보자! (2) 2024.03.06 [ 알고리즘 TIP ] 2차원 배열 회전 (0) 2024.02.20