"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
총 8개의 톱니를 가지고 있는 톱니바퀴 4개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴가 1번, 그 오른쪽은 2번, 그 오른쪽은 3번, 가장 오른쪽 톱니바퀴는 4번이다.
톱니바퀴의 초기 상태와 톱니바퀴를 회전시킨 방법이 주어졌을 때, 최종 톱니바퀴의 상태를 구하는 프로그램을 작성하시오.
'Algorithm > Baekjoon' 카테고리의 다른 글
0518_백준 11403번 : 경로찾기 / 플로이드-워셜 알고리즘 (0) | 2020.05.18 |
---|---|
0514_백준 14890번/경사로_파이썬 (0) | 2020.05.14 |
0512_백준/14499번/주사위 굴리기_파이썬 (2) | 2020.05.12 |
0304_백준 1260번 : DFS와 BFS (개념 알고 익숙해지기) (0) | 2020.03.04 |
0302_백준 15656~15666번 : N과M문제 (재귀함수로 순열, 조합 구하기)part2 (0) | 2020.03.02 |