ygreenb
yellowgreenblue
ygreenb
전체 방문자
오늘
어제
  • TIL (130)
    • Algorithm & Data Structure (70)
      • 이론 (4)
      • 프로그래머스 (54)
      • 백준 (12)
    • JAVA (4)
    • Android Studio (9)
    • Database (1)
    • WEB (25)
      • HTML+CSS (7)
      • Javascript (5)
      • React (11)
      • Django (1)
      • Node.js (1)
    • Computer Vision (13)
    • Git (8)

블로그 메뉴

  • HOME
  • TAG
  • GITHUB

공지사항

인기 글

태그

  • Arrays.sort()
  • 깃
  • Comparator
  • java
  • 프로그래머스 Lv.2
  • 코틀린
  • 해시
  • kotiln
  • 깃허브
  • getOrDefault
  • stack
  • dfs
  • PriorityQueue
  • 프로그래머스
  • 안드로이드
  • compareTo()
  • Android
  • HashMap
  • git
  • git bash
  • Queue
  • greedy
  • 스택/큐
  • sort
  • BFS
  • DP
  • React
  • entrySet
  • reactjs
  • 백준

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ygreenb

yellowgreenblue

[JAVA] 백준 2293번 : 동전 1
Algorithm & Data Structure/백준

[JAVA] 백준 2293번 : 동전 1

2020. 5. 8. 21:52
 

2293번: 동전 1

첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다.

www.acmicpc.net

문제

- n가지 종류의 동전이 주어지고, 각각의 동전이 나타내는 가치는 다를 때, 그 가치의 합이 k원이 되도록 하는 그 경우의 수를 구하는 프로그램.

- 각각의 동전은 몇 개라도 사용가능

- 사용한 동전의 구성이 같은데, 순서만 다른 것은 같은 경우로 침.

 

입력

- 첫째 줄에 n, k가 주어짐. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000)

- 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. (100,000보다 작거나 같은 자연수)

 

출력

첫째 줄에 경우의 수를 출력. (경우의 수는 2^31보다 작다.)

 

 

풀이

 

n=3 , k=5 이고 주어진 동전의 가치를 1,2,5라고 가정했을 때, 가치의 합이 k원이되는 경우의 수를 구한다고 하면

dp[5-coin[0]] 은 가치가 1원인 동전만을 이용했을 때,

dp[5-coin[2]] 은 가치가 1,2원인 동전만을 이용했을 때 같은 식으로 방법을 유도해냈다.

 

따라서, DP[k] = DP[k-coin[0]] + DP[k-coin[1]] + … + DP[k-coin[n-1]] 이다.

 

즉, 새로운 동전이 coin[n-1] 추가될때마다

DP[k] = DP[k](기존의 동전 이용했을때) + DP[k-coin[n-1]](새로 추가한 동전을 포함해 이용했을 때) 이(가) 되는 셈이다.

 

아래 코드에서는 배열 coin[] 에 0번째가 아니라 1번째부터 동전의 가치가 저장되도록 했다.

public class bj2293 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner s = new Scanner(System.in);
		
		int n = s.nextInt(); // n 입력받음 , 동전의 가짓수
		int k = s.nextInt(); // k 입력받음, 
		
		int coin[] = new int[101]; // 동전의 가치
		int dp[] = new int[10001]; // n가지 종류의 동전을 사용해 k원이 되게하는 경우의 수
		
		for(int i=1;i<=n;i++) {
			coin[i]=s.nextInt();
		}
		
		dp[0] = 1;
		for(int i=1;i<=n;i++) { 
			for(int j=coin[i];j<=k;j++){	
				dp[j] += dp[j-coin[i]];
			}
		}
		
		System.out.println(dp[k]);
		s.close();
		
	}

}

'Algorithm & Data Structure > 백준' 카테고리의 다른 글

[JAVA] 백준 14501번 : 퇴사  (0) 2020.05.16
[JAVA] 백준 1932번 : 정수 삼각형  (0) 2020.05.15
[JAVA] 백준 9461번 : 파도반 수열  (0) 2020.05.08
[JAVA] 백준 11726번 : 2Xn 타일링  (0) 2020.05.08
[JAVA] 백준 2225번 : 합분해  (2) 2020.05.08
    'Algorithm & Data Structure/백준' 카테고리의 다른 글
    • [JAVA] 백준 14501번 : 퇴사
    • [JAVA] 백준 1932번 : 정수 삼각형
    • [JAVA] 백준 9461번 : 파도반 수열
    • [JAVA] 백준 11726번 : 2Xn 타일링
    ygreenb
    ygreenb
    개발공부기록장

    티스토리툴바