본문 바로가기
알고리즘/[python] 백준 BOJ

[python] 백준 14891 톱니바퀴

by Alan_Kim 2023. 5. 22.
728x90
반응형

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

 

14891번: 톱니바퀴

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

www.acmicpc.net

 

문제 해결

  • 특정한 하나의 톱니바퀴를 돌릴 때 다른 톱니바퀴가 돌아가는지 안돌아가는지 조건에 맞춰서 확인한다.
  • 결국 중요한 것은 12시 방향의 값이 N극인지 S극인지이다.
  • 돌아갈때 한번에 모두 돌아가는 것이므로 조건에 맞춰서 이웃하는 바퀴가 반대방향으로 돌아가는지 안돌아가는지 확인한다음 안들아가면 다음 톱니바쿼는 볼 필요가 없고 돌아가면 다음 톱니바퀴를 쭉 확인한다.
  • 단순 구현 문제이다.

 

CODE

import sys

input = sys.stdin.readline


def move_left(n, d):
    if n == 1:
        return
    if T[n][6] == T[n - 1][2]:
        return
    turn[n - 1] = (-1) * d
    move_left(n - 1, turn[n - 1])


def move_right(n, d):
    if n == 4:
        return
    if T[n][2] == T[n + 1][6]:
        return
    turn[n + 1] = (-1) * d
    move_right(n + 1, turn[n + 1])


if __name__ == "__main__":
    T = [[]]
    A = list(map(int, list(str(input().rstrip()))))
    T.append(A)
    B = list(map(int, list(str(input().rstrip()))))
    T.append(B)
    C = list(map(int, list(str(input().rstrip()))))
    T.append(C)
    D = list(map(int, list(str(input().rstrip()))))
    T.append(D)
    answer = 0
    k = int(input())
    for _ in range(k):
        num, dir = map(int, input().split())
        turn = [0] * (5)
        turn[num] = dir
        if num > 1:
            move_left(num, dir)
        if num < 4:
            move_right(num, dir)
        for i in range(1, 5):
            if turn[i] == -1:
                x = T[i].pop(0)
                T[i].append(x)
            elif turn[i] == 1:
                x = T[i].pop()
                T[i].insert(0, x)
    for i in range(1, 5):
        if T[i][0] == 1:
            answer += pow(2, i - 1)
    print(answer)
728x90
반응형

댓글