일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 자료구조
- vrm posing desktop
- c#
- windows 12
- 카니발대학교 공대강국
- 택시 기하학
- 닌텐도 스위치 2
- 빅오 표기법
- 코딩테스트
- unity engine
- VRoid Studio
- T자형 인재
- 다이나믹프로그래밍
- 그래픽 디자인
- 시작
- VPS
- 이진 탐색
- blender
- 우선순위 큐
- 스택
- 2025 대한민국 채용박람회
- 큐
- 배열 리스트
- 영어
- 그리디 알고리즘
- 마인크래프트
- 라자냐
- i자형 인재
- 잴다의 전설 티어스 오브 더 킹덤
- 브루트포스 알고리즘
- Today
- Total
WalkerJei's Lifelog
백준알고리즘 11047번 동전 0 C# 본문
세부 정보
- 사이트: 백준알고리즘
- 번호: 11047
- 문제명: 동전 0
- 언어: C#
- 분류: 그리디 알고리즘
- 비고:
문제
준규가 가지고 있는 동전은 총 N종류이고, 각각의 동전을 매우 많이 가지고 있다.
동전을 적절히 사용해서 그 가치의 합을 K로 만들려고 한다. 이때 필요한 동전 개수의 최솟값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000)
둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수)
출력
첫째 줄에 K원을 만드는데 필요한 동전 개수의 최솟값을 출력한다.
풀이
동전의 가치를 입력할 때는 작은 순서대로 입력을 받지만 최소 개수를 구하기 위해서는 큰 것부터 계산해야 한다. 따라서 동전의 최소 개수를 구하는 for문에서는 coinValue.Length - 1부터 0까지 내려가는 방식으로 처리해야 한다.
StreamReader sr = new StreamReader(Console.OpenStandardInput());
StreamWriter sw = new StreamWriter(Console.OpenStandardOutput());
// 동전의 가치 종류와 동전 가치의 목표합 입력
int[] nk = sr.ReadLine().Split().Select(int.Parse).ToArray();
// 동전의 가치 종류를 저장할 배열
int[] coinValue = new int[nk[0]];
// 목표합 달성을 위한 최소 동전 개수
int minCoinCount = 0;
// 동전의 가치 입력
for(int i = 0; i < coinValue.Length; i++)
coinValue[i] = Convert.ToInt32(sr.ReadLine());
for(int i = coinValue.Length - 1; i >= 0 ; i--)
{
// 최소 동전 개수는 목표합에 동전의 가치를 나눠서 계산한다.
minCoinCount += nk[1] / coinValue[i];
// 목표합을 동전 가치로 나눈 나머지 값으로 차액을 반영한다.
nk[1] %= coinValue[i];
}
// 최소 동전 개수 출력
sw.WriteLine(minCoinCount);
sr.Close();
sw.Close();
후기
문제를 풀어보기 전 지난 일이 생각나서 int.Parse()와 Convert.ToInt32의 차이도 조사해 보았다. 일반적으로 int.Parse가 더 빠르지만 그 차이는 미미하다. 그리고 입력 값이 항상 유효한 숫자 문자열임을 확신할 수 있을 때만 사용할 수 있다. 반면 Convert.ToInt32는 null 값을 처리할 수 있는 유연성이 있어서 더 안전한 스크립트 작성이 가능하다고 한다.
그리디 알고리즘에 익숙해 지려면 경우별로 어떻게 처리해야 할 지를 머릿속에 다 쌓아두어야 할 것 같았다. 한 경우를 알아두면 유사한 문제에서 더 빠르게 해결 방법을 떠올리는 것이 쉬워진다.
'소프트웨어 개발 > 코딩테스트(기성 문제)' 카테고리의 다른 글
백준알고리즘 11399번 ATM C# (0) | 2025.04.28 |
---|---|
백준알고리즘 5585번 거스름돈 C# (0) | 2025.04.27 |
백준알고리즘 1920번 수 찾기 C# (0) | 2025.04.25 |
백준알고리즘 10811번 바구니 뒤집기 C# (0) | 2025.04.24 |
백준알고리즘 11279번 최대 힙 C# (0) | 2025.04.23 |