[BOJ 16194] 카드 구매하기2(java)

less than 1 minute read

Bottom-up 풀이

package basics_400;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class BOJ16194 {
	//memo[n] = n개의 카드를 구매하기 위해 지불해야 하는 금액의 최소값 
	static int[] memo;
	//p[i] 카드팩 i개가 포함된 카드팩의 가격 
	static int[]p;
	static int cardPurchase(int n) {

		memo[0] = 0;
		//카드 갯수 1부터 n까지 
		for (int i = 1; i <= n; i++) {
			//최솟값을 구하기 위해 맨 처음 비교 대상은 큰 값으로 할당  
    		memo[i] = Integer.MAX_VALUE;
    		//ex )2개 카드 구매 최소값 구하는 경우
    		// 		memo[2] -> memo[2]와, memo[1]+p[1] (1개 최소값 + 1개 구입)
    		//				   memo[2]와, memo[0]+p[2] (2개짜리 카드2개 구입)
    		
            for (int j = 1; j <= i; j++) {
            	//비교해서 최솟값을 저장 
            	memo[i] = Math.min(memo[i], memo[i - j] + p[j]);
            }
        }
		
		return memo[n];
	}

	public static void main(String[] args) throws NumberFormatException, IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		int n = Integer.parseInt(br.readLine());
		memo = new int[n+1];
		p = new int[n+1];
		st = new StringTokenizer(br.readLine()," ");

		//카드팩 값 넣어줌 
		for(int i=1;i<=n;i++) {
			p[i] = Integer.parseInt(st.nextToken());
		}
		
		System.out.println(cardPurchase(n));

		
	}

}


Comments