[Silver III] 1로 만들기 - 1463
시도횟수 2회
첫 시도는 문제 이해를 잘못한 부분에서 틀렸다.
당연히 나누기를 먼저하는 것이 빠르겠거니 접근했고, 그렇다고 해도 2로 나누는 경우를 1순위로 해야하지만 3으로 나눌경우를 1순위로 하는 코드를 작성하였다.
다시 풀어볼 때는 DP로 접근하여 문제를 해결했다.
틀린코드
import sys
x = int(sys.stdin.readline())
count =0
while True:
if x%3 == 0 :
x//=3
count+=1
else: break
while True:
if x%2 == 0 :
x//=2
count+=1
else: break
count += (x-1)
print(count)
성능 요약
메모리: 38732 KB, 시간: 692 ms
분류
다이나믹 프로그래밍(dp)
문제 설명
정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.
- X가 3으로 나누어 떨어지면, 3으로 나눈다.
- X가 2로 나누어 떨어지면, 2로 나눈다.
- 1을 뺀다.
정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오.
입력
첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.
출력
첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다.
나의 틀린 풀이
그냥 생각없이 풀었다가 시간초과 났음
역시 코딩전에 생각하는 글을 쓰는 것이 좋은듯 합니다.
stack = [[int(input()),0]]
small = 10**6
while stack:
n = stack.pop()
if n[0] == 1:
small = min(small,n[1])
if small <= n[1]:
continue
elif n[0] == 1 :
small = n[1]
if n[0] %3 ==0 :
stack.append([n[0]/3,n[1]+1])
if n[0] %2 == 0:
stack.append([n[0]/2,n[1]+1])
stack.append([n[0]-1 , n[1]+1])
print(small)
나의 맞은 풀이
시간초과를 봤기 때문에 DP를 사용하기로 했습니다.
n = int(input())
dp = [n for i in range(n+1)]
dp[n] = 0
for i in range(n,0,-1):
if i%3 ==0 :
val = i//3
dp[val] = min(dp[val],dp[i]+1)
if i % 2 == 0:
val = i//2
dp[val] = min(dp[val],dp[i] +1)
val = i-1
dp[val] = min(dp[val],dp[i]+1)
print(dp[1])
'알고리즘 문제 풀이 > 백준' 카테고리의 다른 글
[백준] 8진수 2진수 - python[ 구현 ] (0) | 2024.09.09 |
---|---|
[백준] 곱셈- python[ 구현 ] (0) | 2023.11.13 |
[백준] 최단경로- python[ Dijkstra ] (1) | 2023.11.01 |
[백준] 평범한 배낭 - python[ dp ] (0) | 2023.10.31 |
백준 이중 우선순위 큐 - 7662 (0) | 2023.03.29 |