구름톤 챌린지 11번 통증(2)

겨울잠·2023년 8월 28일

구름톤

목록 보기
5/8

https://level.goorm.io/l/challenge/goormthon-challenge

통증 1문제는 a랑 b랑 서로 배수형태엿지만 해당 문제는
2 <= a,b <= 13
인 경우라서 다른 접근이 필요하다.

dp라고 적혀있어서 단순 dp로 풀었지만 시간초과에 재귀 깊이 초과에 난리였따...

다른 방법이 있지 않을까 하다가 생각해 본 것은 순서가 상관 없다는 것이엿다 즉

a = 2
b = 5일경우
aaab 를 골른 결과랑 abaa baaa 다 같은결과이다.. 즉 냅색 문제와 관련 있을 것이라 생각햇다..

https://velog.io/@jxlhe46/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%B0%B0%EB%82%AD-%EB%AC%B8%EC%A0%9C-Knapsack-Problem
그래서 블로그를 참고해서 풀었는데 코드는 다음과 같다.

# -*- coding: utf-8 -*-
# UTF-8 encoding when using korean

n = int(input())
a,b = map(int, input().split())
dp = [[-1,-1] for i in range(10**6+1)]
dp[0] = [0,0]

for i in range(n+1):
	if a <= i:
		if dp[i-a][0] != -1 and dp[i-a][1] != -1:
			dp[i][0] = min(dp[i-a][0] + 1, dp[i-a][1] + 1)
            
		elif dp[i-a][0] != -1:
			dp[i][0] = dp[i-a][0] + 1
            
		elif dp[i-a][1] != -1:
			dp[i][1] = dp[i-a][1] + 1
            
	if b <= i:
		if dp[i-b][0] != -1 and dp[i-b][1] !=-1:
			dp[i][0] = min(dp[i-b][0] + 1, dp[i-b][1] + 1)
            
		elif dp[i-b][0] != -1:
			dp[i][0] = dp[i-b][0] + 1
            
		elif dp[i-b][1] != -1:
			dp[i][1] = dp[i-b][1] + 1
			
if dp[n] == [-1,-1]:
	print(-1)
elif dp[n][0] == -1:
	print(dp[n][1])
elif dp[n][1] == -1:
	print(dp[n][0])
else:
	print(min(dp[n]))
		

코드는 간단하다 -a 칸과 -b칸의 0과 1중에 최소값을 선택하고,
-1이면 무시하는 코드이다...
결과도 만들 수 없는 경우일 떄 -1로 처리해 주었따..

0개의 댓글