dev_beomgeun
꾸준하게 차근차근
dev_beomgeun
전체 방문자
오늘
어제
  • 분류 전체보기 (170)
    • 전공 (0)
      • 운영체제 (0)
      • 알고리즘 (0)
      • 자료구조 (0)
      • 데이터베이스 (0)
      • 네트워크 (0)
    • 개발 공부 (32)
      • 웹 (6)
      • 리눅스 (4)
      • 머신러닝 (1)
      • 스프링 (17)
      • Git (2)
      • AWS (2)
    • 개발 도서, 강의 (3)
      • 스프링 입문을 위한 자바 객체지향의 원리와 이해 (0)
      • 모든 개발자를 위한 HTTP 웹 기본 지식(김영한.. (2)
      • 스프링 부트와 AWS로 혼자 구현하는 웹서비스 (1)
    • 문제 풀이 (118)
      • 백준 알고리즘 (72)
      • 프로그래머스 알고리즘, SQL (38)
      • Hackerrank SQL (8)
    • 프로젝트 기록 (4)
      • 캡스톤 종합설계 (4)
      • 반려하루 프로젝트 (0)
    • 활동 기록 (12)
      • 네이버 부스트캠프 (7)
      • 취준 & 코테 (4)
      • 소프트웨어 마에스트로 13기 (1)
    • 이것저것 (1)

블로그 메뉴

  • 홈
  • 깃허브
  • 링크드인
  • 방명록

공지사항

인기 글

태그

  • 백준 DP
  • 프로그래머스 SQL
  • 스프링
  • 부스트캠프
  • AI Tech
  • 회고
  • Baekjoon
  • HackerRank mysql
  • dp
  • 반성
  • 기록
  • 그래프탐색
  • 서블릿
  • Hackerrank
  • 네이버 부스트캠프
  • 일기
  • 백준
  • 프로그래머스
  • BFS
  • c++

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
dev_beomgeun

꾸준하게 차근차근

문제 풀이/백준 알고리즘

[baekjoon 2294] 동전 2- DP(동적 프로그래밍) (C++)

2021. 2. 18. 19:43
728x90

www.acmicpc.net/problem/2294

 

2294번: 동전 2

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

www.acmicpc.net

주어진 동전의 값을 이용해서 목표한 값을 동전 개수의 합으로 나타내는 경우 중 최소한의 동전 개수를 출력한다.

 

동전의 값보다 작은 숫자는 만들지 못한다.

동전의 값보다 큰 숫자는 크기가 n인 동전으로 구성할 수 있다.

그리고 그 이후에 크기가 n보다 큰 동전으로 그 숫자를 구성할 수 있다면 동전의 개수는 줄어든다.

 

즉, 5를 동전 1, 2, 5로 만들 수 있는 경우를 생각해보면 

 

동전 1을 이용한 최소 개수 : 1 + 1 + 1 + 1 + 1

동전 2를 함께 이용한 최소 개수 : 1 + 2 + 2 가 나온다.

하지만 동전 5가 등장하는 순간 동전 5 하나로 만들 수 있다.

 

즉 dp배열에 작은 동전부터 개수를 갱신해주고, 큰 동전이 나오면 기존 값과 큰 동전으로 갱신할 수 있는 경우 중 최솟값을 저장해주면 된다.

 

3 15

1 5 12의 경우 : 

 

동전 1을 사용  : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

동전 5를 포함  : 1 2 3 4 1 2 3 4 5  2   3  4   5  6  3

동전 12를 포함 : 1 2 3 4 1 2 3 4 5  2  3  1   2  3  4

 

큰 동전이 나오고, 그 동전을 이용할 수 있는 경우 갱신이 되는 점을 이용하면 된다. 그 수만큼 빼주면 남은 수의 배열엔 그 남은 수를 만들 수 있는 최소 경우가 저장되어 있기에 현재 배열도 최솟값이 된다.

dp [13] = dp [13-12] + 1 (동전 12) => 동전 12를 사용하면 13중 1이 남고 dp [1]엔 1을 만들 수 있는 경우 1이 저장되어있다.

 

#include <iostream>
#define INF 987654321
using namespace std;

int n, k, coin[101], dp[10001];

int main() {
	cin >> n >> k;
	for (int i = 0; i < n; i++) {
		cin >> coin[i];
	}

	for (int i = 0; i <= k; i++) {
		dp[i] = INF;
	}

	dp[0] = 0;

	for (int i = 0; i <n; i++) {
		for (int j = coin[i]; j <= k; j++) {
			dp[j] = min(dp[j], dp[j - coin[i]]+1);
		}
	}

	if (dp[k] == INF) {
		cout << -1;
	}
	else {
		cout << dp[k];
	}
}

비슷한 문제로 www.acmicpc.net/problem/1699

1699번 제곱수의 합을 풀어보면 도움이 될 것이다. 이 문제와 차이점은 이룰 수 있는 값이 입력값으로 주어지는지, 제곱수로 정해져 있는지 차이다.

728x90
저작자표시 비영리 변경금지 (새창열림)

'문제 풀이 > 백준 알고리즘' 카테고리의 다른 글

[baekjoon 1541] 잃어버린 괄호 (그리디, 문자열, 수학) (C++)  (0) 2021.02.22
[baekjoon 20548] 칠리소스 (수학, 브루트포스) (C++)  (0) 2021.02.21
[baekjoon 1149] RGB거리 (DP) (C++)  (0) 2021.02.16
[baekjoon 1806] 부분합 (투 포인터) (C++)  (0) 2021.02.15
[baekjoon 1326] 폴짝폴짝 (BFS) (C++)  (0) 2021.02.13
    '문제 풀이/백준 알고리즘' 카테고리의 다른 글
    • [baekjoon 1541] 잃어버린 괄호 (그리디, 문자열, 수학) (C++)
    • [baekjoon 20548] 칠리소스 (수학, 브루트포스) (C++)
    • [baekjoon 1149] RGB거리 (DP) (C++)
    • [baekjoon 1806] 부분합 (투 포인터) (C++)
    dev_beomgeun
    dev_beomgeun
    백엔드 개발을 하며 얻은 지식과 경험을 공유합니다. 현재 카카오페이에서 백엔드 엔지니어로 일하고 있습니다.

    티스토리툴바