0513_백준 14891번/ 톱니바퀴_파이썬
Algorithm/Baekjoon

0513_백준 14891번/ 톱니바퀴_파이썬

728x90
반응형

"deque 모델의 rotate 메소드 사용하기"

[문제 접근]

- 처음에는 주어진 톱니바퀴 번호에 따라 분기처리 하여 하드코딩 했다가, 중간에 실패했다. 이유는 톱니바퀴 4개가 한번에 돌아야 하는데 내가 구현한 코드는 순차적으로 돌아가다 중간에 끊겨서 제대로 된 결과를 얻기 힘들었다.

- 타 블로거님들의 코드를 참고하여 다시 풀었는데, collections 모듈의 deque(double ended queue)의 rotate 메소드를 활용했다.

- rotate의 기본적인 구조 : rotate(n) 요소 n의 값에 따라 음수면 n만큼 왼쪽 회전, 양수면 n만큼 오른쪽 회전(시계방향)

- 시작 톱니를 잡아 ①12시 방향을 기준으로 2번, 6번에 위치한 톱니의 극(1 또는 0) 정보와 ② 회전방향(시계 또는 반시계) 저장

- 시작 톱니 기준으로 왼쪽 방향, 오른쪽 방향을 for문 통해 모든 톱니를 한번에 거치게 된다. 

- deque 자료형과 rotate 메소드 활용법을 익힐 수 있었던 문제.

 

[코드 구현]

from collections import deque

gear = [deque(map(int, input())) for _ in range(4)]
orders = deque(list(map(int, input().split())) for _ in range(int(input())))

while orders:
    num, d = orders.popleft()
    num -= 1 # 인덱스 맞춰주기
    tmp_2 = gear[num][2] # 2,6번자리 값 저장
    tmp_6 = gear[num][6]
    gear[num].rotate(d)
    tmp_direct = d

    # 시작 톱니의 왼쪽
    d = tmp_direct
    for i in range(num-1, -1, -1):
        if gear[i][2] != tmp_6:
            tmp_6 = gear[i][6]
            gear[i].rotate(d*-1)
            d *= -1
        else:
            break

    # 시작 톱니의 오른쪽
    d = tmp_direct
    for i in range(num+1, 4):
        if gear[i][6] != tmp_2:
            tmp_2 = gear[i][2]
            # 톱니 회전 후
            gear[i].rotate(d*-1)
            # 방향 바꾸기
            d *= -1
        else:
            break

# 점수 계산
result = 0
for i in range(4):
    if gear[i][0] == 1:
        result += 2**i
print(result)

[문제 출처]

백준 14891번 톱니바퀴 https://www.acmicpc.net/problem/14891

 

14891번: 톱니바퀴

첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터 �

www.acmicpc.net

총 8개의 톱니를 가지고 있는 톱니바퀴 4개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴가 1번, 그 오른쪽은 2번, 그 오른쪽은 3번, 가장 오른쪽 톱니바퀴는 4번이다.

톱니바퀴의 초기 상태와 톱니바퀴를 회전시킨 방법이 주어졌을 때, 최종 톱니바퀴의 상태를 구하는 프로그램을 작성하시오.

반응형