본문 바로가기
Python/백준

백준 톱니바퀴 [14891] 파이썬(Python) 코드 + 해설

by Guardy 2024. 10. 29.
728x90

백준 14891 톱니바퀴 문제

문제 설명

  • 4개의 톱니바퀴가 일렬로 놓여 있습니다.
  • 각 톱니바퀴는 8개의 톱니를 가지고 있으며, 톱니는 N극(0) 또는 S극(1)을 가집니다.
  • 톱니바퀴는 시계 방향(1) 또는 반시계 방향(-1)으로 회전할 수 있습니다.
  • 톱니바퀴가 회전할 때, 인접한 톱니바퀴와 맞닿은 톱니의 극에 따라 인접한 톱니바퀴가 회전할 수 있습니다.
    • 맞닿은 톱니의 극이 다르면, 인접한 톱니바퀴는 반대 방향으로 회전합니다.
    • 맞닿은 톱니의 극이 같으면, 인접한 톱니바퀴는 회전하지 않습니다.
  • K번의 회전이 주어지며, 각 회전에 대한 톱니바퀴 번호와 회전 방향이 주어집니다.
  • 모든 회전이 끝난 후, 각 톱니바퀴의 12시 방향 톱니의 극에 따라 점수를 계산합니다:
    • 1번 톱니바퀴: S극이면 1점
    • 2번 톱니바퀴: S극이면 2점
    • 3번 톱니바퀴: S극이면 4점
    • 4번 톱니바퀴: S극이면 8점

전체적인 아이디어

  • 톱니바퀴 상태 표현:
    • 각 톱니바퀴를 리스트로 표현하며, 인덱스는 톱니의 위치를 나타냅니다.
    • 인덱스 0은 12시 방향을 나타냅니다.
  • 회전 구현:
    • 톱니바퀴를 시계 방향으로 회전하면 리스트를 오른쪽으로 한 칸 이동합니다.
    • 반시계 방향으로 회전하면 리스트를 왼쪽으로 한 칸 이동합니다.
  • 회전 전파:
    • 각 회전에 대해, 회전할 톱니바퀴와 회전 방향을 결정합니다.
    • 인접한 톱니바퀴가 회전할 수 있는지 확인하고, 회전한다면 회전 방향을 결정합니다.
    • 이를 위해 회전 여부와 방향을 기록하는 리스트를 사용합니다.

단계별 구현

  1. 입력 받기:
    • 4개의 톱니바퀴의 초기 상태를 입력받아 리스트로 저장합니다.
    • 회전 횟수 K와 각 회전에 대한 정보를 입력받습니다.
  2. 회전 함수 구현:
    • 특정 톱니바퀴를 주어진 방향으로 회전시키는 함수를 작성합니다.
  3. 회전 전파 결정:
    • 각 회전에 대해, 해당 톱니바퀴를 회전시킬 때 인접한 톱니바퀴들이 어떻게 회전하는지 결정합니다.
    • 이를 위해 좌우로 전파하며 회전 여부와 방향을 결정합니다.
  4. 회전 실행:
    • 결정된 회전 여부와 방향에 따라 톱니바퀴들을 실제로 회전시킵니다.
  5. 점수 계산:
    • 모든 회전이 끝난 후, 각 톱니바퀴의 12시 방향 톱니의 극에 따라 점수를 계산합니다.

14891 톱니바퀴 정답 파이썬 코드

gears = []
for _ in range(4):
    gear = list(map(int, input().strip()))
    gears.append(gear)

K = int(input())
rotations = [list(map(int, input().split())) for _ in range(K)]

def rotate_gear(gear, direction):
    if direction == 1:  # 시계 방향
        return [gear[-1]] + gear[:-1]
    elif direction == -1:  # 반시계 방향
        return gear[1:] + [gear[0]]
    else:
        return gear

for num, dir in rotations:
    num -= 1  # 인덱스는 0부터 시작
    # 각 톱니바퀴의 회전 방향을 저장하는 리스트 초기화
    directions = [0, 0, 0, 0]
    directions[num] = dir

    # 왼쪽 톱니바퀴 확인
    for i in range(num, 0, -1):
        if gears[i][6] != gears[i - 1][2]:
            directions[i - 1] = -directions[i]
        else:
            break

    # 오른쪽 톱니바퀴 확인
    for i in range(num, 3):
        if gears[i][2] != gears[i + 1][6]:
            directions[i + 1] = -directions[i]
        else:
            break

    # 회전 실행
    for i in range(4):
        if directions[i] != 0:
            gears[i] = rotate_gear(gears[i], directions[i])

# 점수 계산
score = 0
for i in range(4):
    if gears[i][0] == 1:
        score += (1 << i)

print(score)

코드 설명

1. 입력 받기

  • gears 리스트에 4개의 톱니바퀴 상태를 저장합니다.
    • 각 톱니바퀴는 8개의 정수로 이루어진 리스트입니다.
  • 회전 횟수 K와 각 회전에 대한 정보를 rotations 리스트에 저장합니다.

2. 회전 함수 구현

  • rotate_gear(gear, direction) 함수는 주어진 톱니바퀴를 특정 방향으로 회전시킵니다.
    • 시계 방향(1): 리스트를 오른쪽으로 한 칸 이동합니다.
    • 반시계 방향(-1): 리스트를 왼쪽으로 한 칸 이동합니다.

3. 회전 전파 결정

  • 각 회전에 대해 다음을 수행합니다:
    • 회전할 톱니바퀴 번호(num)와 회전 방향(dir)을 가져옵니다.
    • directions 리스트를 초기화하여 각 톱니바퀴의 회전 방향을 저장합니다.
      • 초기에는 모두 0으로 설정하고, 회전하지 않음을 나타냅니다.
      • 회전할 톱니바퀴의 위치에 회전 방향을 저장합니다.
    • 왼쪽 톱니바퀴 확인:
      • 현재 톱니바퀴의 왼쪽 톱니바퀴들을 검사합니다.
      • 맞닿은 톱니의 극이 다르면, 회전 방향을 반대로 설정하고 계속 검사합니다.
      • 맞닿은 톱니의 극이 같으면, 더 이상 회전이 전파되지 않습니다.
    • 오른쪽 톱니바퀴 확인:
      • 현재 톱니바퀴의 오른쪽 톱니바퀴들을 검사합니다.
      • 위와 동일한 방식으로 회전 방향을 결정합니다.

4. 회전 실행

  • directions 리스트에 저장된 회전 방향에 따라 각 톱니바퀴를 회전시킵니다.
  • 회전 방향이 0이 아닌 톱니바퀴만 회전합니다.

5. 점수 계산

  • 모든 회전이 끝난 후, 각 톱니바퀴의 12시 방향 톱니(gears[i][0])의 극을 확인합니다.
  • S극(1)인 경우, 해당 톱니바퀴의 점수를 더합니다.
    • 점수는 2^로 계산됩니다 (i는 0부터 시작).
  • 최종 점수를 출력합니다.

 

백준 14891 정답

 

도움이 되셨다면 공감과 댓글 부탁드립니다.

728x90