Algorithm Solving/Baekjoon

[백준] 14891 톱니바퀴 (파이썬)

bu119 2023. 9. 19. 09:00
728x90
반응형

골드 Ⅴ

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

 

14891번: 톱니바퀴

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

www.acmicpc.net

 

📄 문제

  • 총 8개의 톱니를 가지고 있는 톱니바퀴 4개가 일렬로 놓여져 있다.
  • 톱니는 N극 또는 S극 중 하나를 나타내고 있다.
  • 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴가 1번, 그 오른쪽은 2번, 그 오른쪽은 3번, 가장 오른쪽 톱니바퀴는 4번이다.
  • 이때, 톱니바퀴를 총 K번 회전시키려고 한다.
    • 톱니바퀴의 회전은 한 칸을 기준으로 한다.
    • 회전은 시계 방향과 반시계 방향이 있다.
  • 톱니바퀴가 회전할 때,
    • 서로 맞닿은 극에 따라서 옆에 있는 톱니바퀴를 회전시킬 수도 있고,
    • 회전시키지 않을 수도 있다.
  • 톱니바퀴 A를 회전할 때, 그 옆에 있는 톱니바퀴 B와 서로 맞닿은 톱니의 극이 다르다면, B는 A가 회전한 방향과 반대방향으로 회전하게 된다.

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

 


💡 아이디어

  • 구현 문제이다.

 

📝 문제 풀이 (Code)

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

# 옆에 톱니바퀴가 같은 극인지 다른 극인지 확인하기
# 왼쪽 톱니 바퀴들 확인
def check_left(left_wheel, left_dir):
    global rotate_dir

    left_wheel -= 1

    while 0 <= left_wheel:
        # 같은 극이면 탐색 종료
        if cogwheel[left_wheel][2] == cogwheel[left_wheel+1][6]:
            break

        # 다른 극이면 방향 바꿔주기
        left_dir = -left_dir
        # 바뀐 방향 저장
        rotate_dir[left_wheel] = left_dir
        # 다음 오른쪽 휠 탐색
        left_wheel -= 1

        
# 오른쪽 톱니 바퀴들 확인
def check_right(right_wheel, right_dir):
    global rotate_dir

    right_wheel += 1

    while right_wheel < 4:
        # 같은 극이면 탐색 종료
        if cogwheel[right_wheel-1][2] == cogwheel[right_wheel][6]:
            break

        # 다른 극이면 방향 바꿔주기
        right_dir = -right_dir
        # 바뀐 방향 저장
        rotate_dir[right_wheel] = right_dir
        # 다음 오른쪽 휠 탐색
        right_wheel += 1


# 회전 가능한 톱니바퀴 회전
def rotate_wheel():
    global cogwheel, rotate_dir

    for i in range(4):

        if rotate_dir[i] == 1:
            # 시계 방향으로 회전
            cogwheel[i].appendleft(cogwheel[i].pop())
        elif rotate_dir[i] == -1:
            # 반시계 방향으로 회전
            cogwheel[i].append(cogwheel[i].popleft())


# 톱니바퀴 정보 저장
cogwheel =[deque(map(int, input().rstrip())) for _ in range(4)]

k = int(input())
for _ in range(k):
    wheel, direction = map(int, input().split())
    wheel -= 1
    
    # 회전 정보 저장
    # 방향이 1이면 시계 방향, -1이면 반시계 방향
    rotate_dir = [0] * 4
    rotate_dir[wheel] = direction
    
    # 톱니 바퀴 회전 가능 정보 저장
    # 2번위치, 6번위치 확인
    check_right(wheel, direction)
    check_left(wheel, direction)
    
    # 전체 톱니바퀴 회전
    rotate_wheel()

# 톱니바퀴 점수 합
score = 0
for k in range(4):
    # s극 이면 해당 점수를 더한다.
    # N극은 0, S극은 1
    if cogwheel[k][0]:
        score += 2**k
print(score)
728x90
반응형