반응형
문제
https://www.acmicpc.net/problem/33677

코드
import math
from collections import deque
n = int(input())
data = {}
day = 0
answer = 10**8
water = 0
data[1] = [answer, water]
data[n] = [0,0] # day, water
queue = deque()
queue.append(n)
while queue:
cur = queue.popleft()
if n == 0:
data[1] = [-1, -1]
break
if n == 1:
data[1] = [0, 0]
break
if n == 2:
data[1] = [1, 1]
break
if cur <= 1:
continue
data1 = cur - 1
if data1 in data:
if data[data1][0] > data[cur][0] + 1:
data[data1][0] = data[cur][0] + 1
data[data1][1] = data[cur][1] + 1
queue.append(data1)
if data[data1][0] == data[cur][0] + 1 and data[data1][1] > data[cur][1] + 1:
data[data1][0] = data[cur][0] + 1
data[data1][1] = data[cur][1] + 1
queue.append(data1)
else:
data[data1] = [data[cur][0] + 1, data[cur][1] + 1]
queue.append(data1)
if cur % 3 == 0:
data2 = cur // 3
if data2 in data:
if data[data2][0] > data[cur][0] + 1:
data[data2][0] = data[cur][0] + 1
data[data2][1] = data[cur][1] + 3
queue.append(data2)
if data[data2][0] == data[cur][0] + 1 and data[data2][1] > data[cur][1] + 3:
data[data2][0] = data[cur][0] + 1
data[data2][1] = data[cur][1] + 3
queue.append(data2)
else:
data[data2] = [data[cur][0] + 1, data[cur][1] + 3]
queue.append(data2)
if math.sqrt(cur) == int(math.sqrt(cur)):
if not (cur == 1):
data3 = int(math.sqrt(cur))
if data3 in data:
if data[data3][0] > data[cur][0] + 1:
data[data3][0] = data[cur][0] + 1
data[data3][1] = data[cur][1] + 5
queue.append(data3)
if data[data3][0] == data[cur][0] + 1 and data[data3][1] > data[cur][1] + 5:
data[data3][0] = data[cur][0] + 1
data[data3][1] = data[cur][1] + 5
queue.append(data3)
else:
data[data3] = [data[cur][0] + 1, data[cur][1] + 5]
queue.append(data3)
# print(data)
print(data[1][0]+1, data[1][1]+1)
예쁘게 풀지는 않았지만 . .
dp와 큐를 이용한 풀이입니다.
n에서 내려가면서 계산하는 탑다운 풀이입니다.
n - 1, n % 3 == 0이라면 추가적으로 n // 3, n ** 0.5가 정수라면 추가적으로 n ** 0.5을 계산해서 기존 딕셔너리와 비교합니다.
기존에 있는 값이 없거나, 기존값보다 날짜가 더 빠르다면 갱신해주고 큐에 다시 삽입하여 순회합니다.
반응형
'Programming > 알고리즘' 카테고리의 다른 글
[백준/Python] 1005번 ACM Craft (0) | 2025.03.18 |
---|---|
[백준/Python] 1647번 도시 분활 계획 (0) | 2025.03.02 |
[백준/Python] 1644번 소수의 연속합 (0) | 2025.02.28 |
[백준/Python] 32986번 나는 건포도가 싫어요 (0) | 2025.01.18 |
[프로그래머즈/Python] 2022 블라인드 카카오 - 양궁대회 (0) | 2025.01.05 |
댓글