1. 해결 방법
"""
1. 아이디어
- 회전시킬 톱니가 시계방향으로 회전 했을 때, 맨 뒤의 큐 데이터를 빼고 앞에 붙인다. (pop())
- 시계 반대 방향이면 앞의 데이터를 빼고 뒤로 붙인다. (popleft())
- 3번째 톱니를 회전시킬 때 1, 2번째 톱니의 오른쪽 위치와 극이 다른지 같은지 확인
- 3번째 톱니를 회전시킬 때 4번째 톱니의 왼쪽 위치와 극이 다른지 같은지 확인
- 3번째 톱니를 시계 방향으로 회전했을 때 4번째 톱니의 왼쪽 위치와 3번째 톱니의 오른쪽 위치가 극이 같으면 리턴, 다르면 반대 방향으로 회전 후 pop, popleft
- 2번째 톱니의 오른쪽 위치와 3번째 톱니의 왼쪽 위치 극이 다를 때, 2번째 톱니는 시계 방향으로 회전 Pop, popleft
- 1번째도 반복
- 각 톱니의 12시 방향의 극을 점수화 해서 print
- 재귀로 해결
"""
2. 정답코드
입력 예제(1)
10101111
01111101
11001110
00000010
2
3 -1
1 1
출력 예제(1)
7
입력 예제(2)
11111111
11111111
11111111
11111111
3
1 1
2 1
3 1
출력 예제(2)
15
입력 예제(3)
10001011
10000011
01011011
00111101
5
1 1
2 1
3 1
4 1
1 -1
출력 예제(3)
6
입력 예제(4)
10010011
01010011
11100011
01010101
8
1 1
2 1
3 1
4 1
1 -1
2 -1
3 -1
4 -1
출력 예제(4)
5
코드
from collections import deque
import sys
input = sys.stdin.readline
def right_rotate(w, d):
if w > 4: return
if wheels[w - 1][2] == wheels[w][6]:
return
else:
right_rotate(w + 1, -d)
wheels[w].rotate(d)
def left_rotate(w, d):
if w < 1: return
if wheels[w][2] == wheels[w + 1][6] or w < 1:
return
else:
left_rotate(w - 1, -d)
wheels[w].rotate(d)
wheels = {}
for i in range(1, 5):
wheels[i] = deque(list(map(int, input().replace("\n", ""))))
k = int(input())
for _ in range(k):
w, d = map(int, input().split())
right_rotate(w + 1, -d)
left_rotate(w - 1, -d)
wheels[w].rotate(d)
answer = 0
for i in range(1, 5):
answer += wheels[i][0] * (2 ** (i - 1))
print(answer)
일단 어려운 문제였다.
아이디어 생각은 크게 어렵지 않으나 재귀를 이용할 부분을 생각하지 못해서 정답까지 이끌어내지 못했다.
혼자 스스로는 절반도 해내지 못했지만 다시 풀어볼 가치가 충분히 있는 좋은 문제인 것 같다.
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ] 17144. 미세먼지 안녕! (0) | 2022.08.04 |
---|---|
[BOJ] 16234. 인구 이동 (0) | 2022.07.18 |
[BOJ] 1966. 프린터 큐 (0) | 2022.07.11 |
[BOJ] 14503. 로봇 청소기 (0) | 2022.06.28 |
[BOJ] 10819. 차이를 최대로 (0) | 2022.06.24 |