티스토리 뷰

백준 스터디

백준 14891번: 톱니바퀴 (파이썬)

박완희버서커 2025. 8. 30. 13:33
반응형
백준 14891번: 톱니바퀴 (파이썬) 문제 풀이

백준 14891번: 톱니바퀴 (파이썬) 문제 풀이


문제 설명


백준 14891번 톱니바퀴 문제는 4개의 톱니바퀴가 주어지고, 각각 8개의 톱니(극: N=0, S=1)로 구성되어 있을 때, 주어진 회전 명령에 따라 톱니들이 어떻게 움직이는지를 시뮬레이션한 뒤 최종 점수를 계산하는 문제입니다.



핵심 규칙


  • 회전 명령을 받은 톱니는 무조건 회전합니다.
  • 인접한 톱니는 서로 맞닿은 극이 다르면 반대 방향으로 회전합니다.
  • 맞닿은 극이 같으면 그쪽 전파는 멈춥니다.
  • 최종 점수는 다음과 같이 계산됩니다.
    • 1번 톱니의 12시 방향이 S극 → +1점
    • 2번 톱니의 12시 방향이 S극 → +2점
    • 3번 톱니의 12시 방향이 S극 → +4점
    • 4번 톱니의 12시 방향이 S극 → +8점


접근 방법


  • 4개의 톱니바퀴를 각각 리스트로 저장하고, 각 톱니의 극(0 또는 1)을 원소로 다룹니다.
  • 톱니바퀴 회전은 리스트의 원소를 시계/반시계 방향으로 한 칸씩 이동시키는 함수로 구현합니다.
  • 회전 명령이 주어졌을 때, 해당 톱니바퀴를 기준으로 양 옆 톱니바퀴들의 회전 여부와 방향을 먼저 결정합니다. 이는 인접한 톱니바퀴의 맞닿은 극이 다른지 확인하면 됩니다.
  • 맞닿은 극은 왼쪽 톱니의 2번 인덱스와 오른쪽 톱니의 6번 인덱스를 비교하여 판단합니다.
  • 톱니바퀴의 회전 방향을 저장할 check 배열을 사용합니다. 1은 시계, -1은 반시계, 0은 회전하지 않음을 의미합니다.
  • 모든 톱니바퀴의 회전 방향이 결정된 후, 한 번에 모든 톱니바퀴를 회전시킵니다.
  • 마지막으로, 각 톱니바퀴의 12시 방향(0번 인덱스)의 극을 확인하여 최종 점수를 계산합니다.


전체 코드 (Python)


def Clockwise(arr:list, direction):
    next=0
    if direction == 1:
        prev = arr[0]
        for i in range(1, 8):
            next = arr[i]
            arr[i] = prev
            prev = next
        arr[0] = prev
    elif direction == -1:
        prev = arr[7]
        for i in range(6, -1, -1):
            next = arr[i]
            arr[i] = prev
            prev = next
        arr[7] = prev

arr=[]
for _ in range(4):
    temp = input()
    arr1 = []
    for j in temp:
        arr1.append(int(j))
    arr.append(arr1)

k = int(input())
for _ in range(k):
    top, clock = map(int, input().split())
    check = [0, 0, 0, 0]
    check[top-1] = clock
    
    # 오른쪽 방향 전파
    for i in range(top, 4):
        if arr[i-1][2] != arr[i][6]:
            check[i] = -check[i-1]
        else:
            break
            
    # 왼쪽 방향 전파
    for i in range(top-1, 0, -1):
        if arr[i-1][2] != arr[i][6]:
            check[i-1] = -check[i]

    # 모든 톱니바퀴 회전
    for i in range(4):
        if check[i] == 1:
            Clockwise(arr[i], 1)
        elif check[i] == -1:
            Clockwise(arr[i], -1)

sumArr = arr[0][0] + 2 * arr[1][0] + 4 * arr[2][0] + 8 * arr[3][0]
print(sumArr)

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/09   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함
반응형