14891: 톱니바퀴

ewillwin·2023년 6월 21일
0

Problem Solving (BOJ)

목록 보기
83/230

전반적인 구현 흐름

  • 이 문제는 회전할 톱니바퀴 기준으로 다른 어느 톱니바퀴가 회전을 할건지를 판별해야하는데 그 부분이 좀 어려웠다
  • left(), right() 함수를 구현하여 회전할 톱니바퀴를 기준으로 왼쪽, 오른쪽을 재귀적으로 탐색하여 추가적으로 톱니바퀴를 회전시켜주었다.
  • 추가사항) 각 회전을 수행해줄 때, 왼쪽, 오른쪽 탐색을 마친 후에 기존 gear를 회전시켜줘야함. 탐색하는 과정에서 Gears의 상태가 변하면 안됨.

left(gear_idx, direction)

  • 처음에 회전할 톱니바퀴 기준으로 왼쪽에 있는 톱니바퀴들을 탐색함
  • gear_idx가 0보다 작거나 맞닿은 톱니바퀴가 같은 극인 경우(Gears[gear_idx][2] == Gears[gear_idx+1][6]) return (함수 종료)
  • 맞닿은 톱니바퀴가 다른 극인 경우 left(gear_idx - 1, -direction)함수를 재귀 호출하여 계속해서 탐색 진행 (옆으로 이동할 때마다 direction을 toggle 해줘야함)
    +) 해당 gear를 회전시켜줌

right(gear_idx, direction)

  • 처음에 회전할 톱니바퀴 기준으로 왼쪽에 있는 톱니바퀴들을 탐색함
  • gear_idx가 4 이상이거나 맞닿은 톱니바퀴가 같은 극인 경우(Gears[gear_idx][6] == Gears[gear_idx-1][2]) return (함수 종료)
  • 맞닿은 톱니바퀴가 다른 극인 경우 right(gear_idx + 1, -direction)함수를 재귀 호출하여 계속해서 탐색 진행 (옆으로 이동할 때마다 direction을 toggle 해줘야함)
    +) 해당 gear를 회전시켜줌
import sys
from collections import deque

def left(gear_idx, direction):
	global Gears
	if gear_idx < 0:
		return
	if Gears[gear_idx][2] == Gears[gear_idx+1][6]:
		return
	
	if Gears[gear_idx][2] != Gears[gear_idx+1][6]:
		left(gear_idx-1, -direction) #왼쪽 gear 더 조사
		Gears[gear_idx].rotate(direction)

def right(gear_idx, direction):
	global Gears
	if gear_idx >= 4:
		return
	if Gears[gear_idx][6] == Gears[gear_idx-1][2]:
		return
	
	if Gears[gear_idx][6] != Gears[gear_idx-1][2]:
		right(gear_idx+1, -direction) #오른쪽 gear 더 조사
		Gears[gear_idx].rotate(direction)

Gears = []
for _ in range(4):
	Gears.append(deque(list(map(int, sys.stdin.readline()[:-1]))))
K = int(input())
rotation = []
for _ in range(K):
	rotation.append(list(map(int, sys.stdin.readline()[:-1].split())))

for k in range(K): #각 회전 수행
	gear_idx = rotation[k][0] - 1
	left(gear_idx - 1, -rotation[k][1]) #왼쪽 탐색
	right(gear_idx + 1, -rotation[k][1]) #오른쪽 탐색
	Gears[gear_idx].rotate(rotation[k][1]) #기존 gear 회전
	# 탐색 완료한 후 기존 gear를 회전시켜야함! (탐색하는 과정에서 Gears의 상태가 변하면 안됨)
#score 계산
score = 0; weight = 0
for i in range(4):
	weight = 2**i
	if Gears[i][0] == 1: score += weight
print(score)
profile
💼 Software Engineer @ LG Electronics | 🎓 SungKyunKwan Univ. CSE

0개의 댓글