728x90
문제 설명
- 4개의 톱니바퀴가 일렬로 놓여 있습니다.
- 각 톱니바퀴는 8개의 톱니를 가지고 있으며, 톱니는 N극(0) 또는 S극(1)을 가집니다.
- 톱니바퀴는 시계 방향(1) 또는 반시계 방향(-1)으로 회전할 수 있습니다.
- 톱니바퀴가 회전할 때, 인접한 톱니바퀴와 맞닿은 톱니의 극에 따라 인접한 톱니바퀴가 회전할 수 있습니다.
- 맞닿은 톱니의 극이 다르면, 인접한 톱니바퀴는 반대 방향으로 회전합니다.
- 맞닿은 톱니의 극이 같으면, 인접한 톱니바퀴는 회전하지 않습니다.
- K번의 회전이 주어지며, 각 회전에 대한 톱니바퀴 번호와 회전 방향이 주어집니다.
- 모든 회전이 끝난 후, 각 톱니바퀴의 12시 방향 톱니의 극에 따라 점수를 계산합니다:
- 1번 톱니바퀴: S극이면 1점
- 2번 톱니바퀴: S극이면 2점
- 3번 톱니바퀴: S극이면 4점
- 4번 톱니바퀴: S극이면 8점
전체적인 아이디어
- 톱니바퀴 상태 표현:
- 각 톱니바퀴를 리스트로 표현하며, 인덱스는 톱니의 위치를 나타냅니다.
- 인덱스 0은 12시 방향을 나타냅니다.
- 회전 구현:
- 톱니바퀴를 시계 방향으로 회전하면 리스트를 오른쪽으로 한 칸 이동합니다.
- 반시계 방향으로 회전하면 리스트를 왼쪽으로 한 칸 이동합니다.
- 회전 전파:
- 각 회전에 대해, 회전할 톱니바퀴와 회전 방향을 결정합니다.
- 인접한 톱니바퀴가 회전할 수 있는지 확인하고, 회전한다면 회전 방향을 결정합니다.
- 이를 위해 회전 여부와 방향을 기록하는 리스트를 사용합니다.
단계별 구현
- 입력 받기:
- 4개의 톱니바퀴의 초기 상태를 입력받아 리스트로 저장합니다.
- 회전 횟수 K와 각 회전에 대한 정보를 입력받습니다.
- 회전 함수 구현:
- 특정 톱니바퀴를 주어진 방향으로 회전시키는 함수를 작성합니다.
- 회전 전파 결정:
- 각 회전에 대해, 해당 톱니바퀴를 회전시킬 때 인접한 톱니바퀴들이 어떻게 회전하는지 결정합니다.
- 이를 위해 좌우로 전파하며 회전 여부와 방향을 결정합니다.
- 회전 실행:
- 결정된 회전 여부와 방향에 따라 톱니바퀴들을 실제로 회전시킵니다.
- 점수 계산:
- 모든 회전이 끝난 후, 각 톱니바퀴의 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부터 시작).
- 최종 점수를 출력합니다.
도움이 되셨다면 공감과 댓글 부탁드립니다.
728x90
'Python > 백준' 카테고리의 다른 글
백준 사다리 조작 [15684] 파이썬(Python) 코드 + 해설 (1) | 2024.10.30 |
---|---|
백준 감시 [15683] 파이썬(Python) 코드 + 해설 (0) | 2024.10.29 |
백준 경사로 [14890] 파이썬(Python) 코드 + 해설 (0) | 2024.10.28 |
백준 스타트와 링크 [14889] 파이썬(Python) 코드 + 해설 (0) | 2024.10.27 |
백준 연산자 끼워넣기 [14888] 파이썬(Python) 코드 + 해설 (0) | 2024.10.26 |