1463번: 1로 만들기 (acmicpc.net)
##
bottom up방식으로 배열 채우면서 했어야되는 문제인가??
dp 태그가 붙어있다
##
import collections
N = int(input())
# 1로 만들기, 반대로 1에서 N을 만들자
q = collections.deque()
q.append(1)
visited = set()
visited.add(1)
count = 0
while(True):
q2 = collections.deque()
if N in q:
break
count += 1
while(len(q) != 0):
x = q.pop()
for tmp in (x*3,x*2,x+1):
if (1<=tmp<=1000000) and (tmp not in visited):
q2.append(tmp)
visited.add(tmp)
q = q2
print(count)
여러번 제출해서 틀렸던 문제인데
비슷한 문제 풀어보니까 바로 정답이 나오네
동아리 활동지에 있던건데 내가 푼건 BFS 라고 하는게 맞지 않나...?? gpt가 내 말이 맞다고 했다..
```python
N = int(input())
dp = [0] * (N + 1)
for i in range(2, N + 1):
# 기본적으로 i-1에서 1을 더하는 경우
dp[i] = dp[i - 1] + 1
if i % 2 == 0:
dp[i] = min(dp[i], dp[i // 2] + 1)
if i % 3 == 0:
dp[i] = min(dp[i], dp[i // 3] + 1)
print(dp[N])
```
DP를 사용한 Bottom-Up 접근
DP 배열 정의:
dp[i]
는 정수i
를 1로 만들기 위한 최소 연산 횟수를 저장합니다.
초기화:
dp[1] = 0
: 1은 이미 1이므로 연산 횟수가 0입니다.
점화식:
- 모든
i
에 대해dp[i]
는 다음 세 가지 경우 중 최솟값입니다:i
가 3으로 나누어 떨어지면dp[i/3] + 1
i
가 2로 나누어 떨어지면dp[i/2] + 1
i-1
인 경우dp[i-1] + 1
- 모든
구현:
dp
배열을 1부터N
까지 채워나가면서 점화식을 적용합니다.
코드 설명
dp[i]
는i
를 1로 만들기 위한 최소 연산 횟수를 저장하는 배열입니다.dp[1]
은 0으로 초기화합니다.- 2부터
N
까지 반복하며, 각i
에 대해 가능한 세 가지 연산(1을 빼기, 2로 나누기, 3으로 나누기)을 고려하여 최소값을 구합니다. - 최종적으로
dp[N]
에는N
을 1로 만들기 위한 최소 연산 횟수가 저장됩니다.
이 방식은 BFS와 다르게 각 정수를 한 번씩만 계산하므로 더 효율적입니다. 따라서 주어진 문제를 해결하는 데 적합한 방법 중 하나입니다.
...
0 댓글