난이도 : Silver3
Link : https://www.acmicpc.net/problem/25418
Tag : 다이나믹 프로그래밍, 그래프 이론, 그래프 탐색, 너비 우선 탐색
풀이일자 : 2024년 9월 25일
A : 주어진 양의 정수
K : 만들 정수
연산 1번 : A + 1
연산 2번 : A * 2
본 문제는 A에서 1번 연산방법과 2번 연산방법을 이용하여 최소 연산으로 K를 만들어내는 문제이다.
1 ≤ A < K ≤ 1,000,000 이므로
최대한 적은 연산의 모든 경우의 수를 탐색하려고 했을때 연산 2번을 통해 A와 K의 격차를 크게 줄일 수 있으므로 시간 복잡도 상 문제는 없을 것으로 보인다.
이 문제를 보는 순간 접근 방법은 두가지로 떠올랐다.
첫번째 방법은 DP 방법으로 연산 1번 2번의 경우들을 저장하면서 A가 K랑 같아지는 경우를 찾는경우이다.
두번째 방법은 BFS 방법으로 방문 노드를 확인하고, 방문한 적이 없다면 연산을 진행하여 만들 수 있는 정수들을 찾고 K와 같아졌을 때 값을 찾아내는 것이다.
첫번째 방법으로 본 문제를 풀려고 접근했으나, 각 연산 방법을 정할때마다 2가지 경우로 나눠지는 것을 생각했을 때 배열의 크기가 너무 커질 것이라 생각이들어 두번째 방법으로 문제를 접근하였다.
from collections import deque
a,k = map(int,input().split())
queue = deque([(a,0)]) #a값, 연산횟수
visited = set([a])
answer = 0
while queue:
now, answer = queue.popleft()
if now == k:
break
if (now + 1) <= k and (now + 1) not in visited:
visited.add(now + 1)
queue.append((now+1, answer+1))
if (now * 2) <= k and (now * 2) not in visited:
visited.add(now * 2)
queue.append((now*2 , answer + 1))
print(answer)