[BaekJoon] 백준 1463번 : 1로 만들기

Updated:

1463번 : 1로 만들기

Make1


위 세 가지 연산을 가지고 최소한의 연산을 통해 1을 만들면 되는 문제.

무언가 어떤 과정을 거쳐 목표로 가는데 있어서 작업의 수의 최솟값이나 최댓값을 구할 땐 DP 를 사용하면 된다.

또는 피보나치 수를 구하는 것 처럼 어떤 목표에 도달 할 때 중복 작업을 굉장히 많이 하면 DP 를 사용하면 될 것 같다.

이 문제는 Bottom - Top DP 를 사용하면 된다. 우리는 N 이 1, 2, 3 일땐 각각 0, 1, 1 이란 것 을 알고 있다.

따라서 사전에 1, 2, 3 일때 최소 연산 횟수를 저장 해 준 뒤 N 이 4 일때 부터 계산을 하면 된다.

만약 N 이 6 이 입력된다면 6 % 3 , 6 % 2, 6 - 1 을 키로 하는 값을 찾아 그 중 최솟값과 1 을 더해주면 된다.

이 경우 num_dict[2] , num_dict[3] , num_dict[5] 중에 최솟값인 1 을 더해주면 된다.

위에선 DP 를 사용하면 된다고 했는데 DP 를 사용 해야겠다는 생각을 하기가 아직 어려운 것 같다..


N = int(input())
answer = 0
num_dict = {
	1: 0,
	2: 1,
	3: 1
}

for i in range(4, N + 1):
	check = []
	if i % 3 == 0:
		check.append(num_dict[i // 3])

	if i % 2 == 0:
		check.append(num_dict[i // 2])

	check.append(num_dict[i - 1])

	num_dict[i] = 1 + min(check)

print(num_dict[N])

Categories:

Updated:

Leave a comment