본문 바로가기

Coding Test/BOJ

[백준/Python] 14891 톱니바퀴

문제 링크

 

14891번: 톱니바퀴

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

www.acmicpc.net

 

문제 풀이

  • 톱니바퀴는 시계방향 또는 반시계 방향으로 움직이므로, 각 톱니바퀴를 큐에 담아 하나의 리스트에 담는다.
  • 인접한 톱니바퀴를 모두 확인하면서 해당 톱니바퀴를 어느 방향으로 회전해야 하는지 확인해야 한다.
  • 따라서 현재 시작 위치에서 왼쪽, 오른쪽을 각각 하나씩 탐색하면 된다.

 

전체 코드

import sys
from collections import deque
input = sys.stdin.readline

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

for i in range(k):
    # 톱니바퀴 회전 상태 저장
    stat = [0, 0, 0, 0]
    tmp = move[i][0] - 1
    stat[tmp] = move[i][1]
    # 현재 위치에서 왼쪽 톱니바퀴 확인
    while True:
        if tmp == 0:
            break
        if gear[tmp][-2] != gear[tmp-1][2]:
            if stat[tmp] == 1:
                stat[tmp-1] = -1
            elif stat[tmp] == -1:
                stat[tmp-1] = 1
        tmp -= 1
    tmp = move[i][0] - 1
    # 현재 위치에서 오른쪽 톱니바퀴 확인
    while True:
        if tmp == 3:
            break
        if gear[tmp][2] != gear[tmp+1][-2]:
            if stat[tmp] == 1:
                stat[tmp+1] = -1
            elif stat[tmp] == -1:
                stat[tmp+1] = 1
        tmp += 1
    # 회전 상태에 따라 톱니바퀴 회전
    for j in range(4):
        if stat[j] != 0:
            gear[j].rotate(stat[j])

res = 0
for i in range(4):
    if gear[i][0] == 1:
        res += 2 ** i

print(res)
반응형