본문 바로가기

백준 문제풀이

14891번: 톱니바퀴 / gold 5 / 구현, 시뮬레이션

https://www.acmicpc.net/problem/14891

 

14891번: 톱니바퀴

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

www.acmicpc.net

'''
14891번: 톱니바퀴 / gold 5 / 구현, 시뮬레이션
'''
import sys
from collections import deque

input = sys.stdin.readline

# 톱니바퀴 입력받기
graph = deque()
for i in range(4):
    case = deque(input().rstrip())
    graph.append(case)
# 회전 입력받기
move = []
# 시뮬레이션
K = int(input())
for _ in range(K):
    move_num, move_dir = map(int, input().split())
    move_num -= 1
    move_dir_rev = move_dir * -1
    move_graph = []
    move_graph.append((move_num, move_dir))
    # 움직일 톱니바퀴의 왼쪽 체크
    for i in range(move_num - 1, -1, -1):
        if graph[i][2] != graph[i + 1][6]:
            move_graph.append((i, move_dir_rev))
            move_dir_rev *= -1
        else:
            break
    # 움직일 톱니바퀴의 오른쪽 체크
    move_dir_rev = move_dir * -1
    for i in range(move_num + 1, 4):
        if graph[i - 1][2] != graph[i][6]:
            move_graph.append((i, move_dir_rev))
            move_dir_rev *= -1
        else:
            break
    # 톱니바퀴 움직이기 
    for index, dir in move_graph:
        if dir == 1:
            graph[index].appendleft(graph[index].pop())
        else:
            graph[index].append(graph[index].popleft())
# 결과값 출력하기
res = 0
point = [1, 2, 4, 8]
for i in range(4):
    if graph[i][0] == '1':
        res += point[i]
print(res)

코드 리뷰

- 해당 문제를 푸는데 약 40분 소요되었고, 정답 판정을 받았습니다.

 

- 톱니바퀴 번호와 방향을 입력 받으면, 다른 톱니 바퀴들도 체크를 하도록 구현 했습니다.

    - 조건에 맞게 움직여야 할 톱니바퀴들, 방향을 리스트에 넣어 체크

- 그 후, 움직여야 할 톱니바퀴 리스트 활용하여 움직입니다.