티스토리 뷰

알고리즘/백준

[백준] 2839번 설탕 배달

머어하지 2018. 11. 16. 00:52

생각

Github - https://github.com/hellojdh/Code/blob/master/src/baekjoon/q1000/Q2839.java N을 준다. 3kg과 5kg의 설탕 봉지를 이용해서 N을 만들 때 최소의 개수를 사용하는 경우를 구하여라. N을 만들 수 없을 경우 -1을 출력한다.


처음 생각

이전에 풀어본것 같아서 검색을 해보니 풀어본 적이 있긴했었다. 보지는 않고 푼 후 비교를 해보니 접근 방식이 달리지긴 했다.([알고리즘/백준] - [문제] 백준 2839번(설탕 배달))

▶ 이전엔 그리디 적으로 수식으로 접근했었다.


다음 생각

이번에는 DP로 접근해서 풀이를 했다. N까지 접근을 하면서 3kg 짜리로 N에 접근할 수 있는 N-3에서의 값과 5kg 짜리로 N에 접근할 수 있는 N-5에서의 값 중 최소 개수이므로 작은 값을 택하면서 Bottom-up 방식으로 N까지 접근한다.

▶ 작은 값을 택해야하므로 배열의 초기화를 나올 수 없는 값인 9999로 해주었다.(최대 N이 5000이므로 9999는 나올 수 없다) 즉, 결과값인 dp[N]이 9999이거나 10000일 경우 불가능으로 -1을 출력해주었다.

▶ 10000을 제외 조건으로 포함시킨 이유는 둘 중 작은 값을 택한 후 +1을 해주어 설탕 묶음을 더해주었기 때문에 9999에서 +1한 값인 10000도 제외조건으로 해주었다.


방안

1) 수학적으로 접근해도 좋고 DP로 접근해도 좋고 다양한 방법이 더 있을 것 같다.


2) Java 풀이


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package baekjoon.q1000;
 
import java.util.Arrays;
import java.util.Scanner;
 
public class Q2839 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] dp = new int[n+10];
        Arrays.fill(dp,9999);
        dp[3= 1;
        dp[5= 1;
        // 3 짜리를 더해서 만들 수 있는 경우와
        // 5 짜리를 더해서 만들 수 있는 경우 중 작은 경우 선택
        for(int i=6;i<=n;i++)
            dp[i] = min(dp[i-3],dp[i-5])+1;
        if(dp[n]==10000 || dp[n]==9999System.out.println(-1);
        else System.out.println(dp[n]);
    }
    private static int min(int x,int y){return x>y?y:x;}
}
 


3) C++ 풀이(Java 풀이를 토대로 짜보는 중인데 배우는 중이라 어색한 표현이 있을 수 있습니다!)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
using namespace std;
 
int main() {
    int n;
    cin >> n;
    int dp[n+10];
    for(int i=0;i<n+10;i++)
        dp[i] = 9999;
    dp[3= 1;
    dp[5= 1;
 
    for(int i=6;i<=n;i++)
        dp[i] = min(dp[i-3],dp[i-5])+1;
    if(dp[n]==9999 || dp[n]==10000cout << -1;
    else cout << dp[n];
    return 0;
}

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 10953번 A+B -6  (4) 2018.11.16
[백준] 10951번 A+B - 4  (0) 2018.11.16
[백준] 1700번 멀티탭 스케줄링  (0) 2018.11.12
[백준] 11000번 강의실 배정  (0) 2018.11.12
[백준] 1931번 회의실배정  (0) 2018.11.11
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday