본문 바로가기

Algorithm/BOJ

[BOJ] 14891. 톱니바퀴

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