[6주차] 알고리즘
<백준 11047번>
https://www.acmicpc.net/problem/11047
문제
준규가 가지고 있는 동전은 총 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원을 만드는데 필요한 동전 개수의 최솟값을 출력한다.
이 문제는 그리디 알고리즘(Greedy Algorithm)을 이용하여 해결할 수 있다. 그리디 알고리즘은 매 단계에서 가장 최선의 선택을 하는 알고리즘으로, 이 문제에서는 가치가 가장 큰 동전부터 사용하는 것이 가장 최선의 선택이다. 따라서 가치가 큰 동전부터 사용하면서 필요한 동전 개수의 최솟값을 구할 수 있다.
- 입력으로 주어진 동전의 가치를 오름차순으로 정렬한다.
- 가치가 큰 동전부터 사용하면서, 현재 사용 중인 동전들의 가치의 합이 K와 같아지면 종료한다.
- 현재 사용 중인 동전들의 가치의 합이 K보다 크면 다음으로 작은 가치의 동전을 사용한다.
- 2, 3번의 과정을 반복하면서 필요한 동전 개수를 센다.
파이썬 코드로 구현해보면
n, k = map(int, input().split()) # 동전의 종류 수와 만들어야 할 가치
coin = [] # 동전의 가치를 저장할 리스트
for _ in range(n):
coin.append(int(input()))
coin.sort(reverse=True) # 동전의 가치를 큰 순서대로 정렬
count = 0 # 필요한 동전 개수를 저장할 변수
for c in coin:
if k == 0: # 만들어야 할 가치가 0원이면 종료
break
count += k // c # 현재 가치의 동전으로 만들 수 있는 개수를 더함
k %= c # 현재 가치의 동전으로 만들고 남은 가치를 계산함
print(count) # 필요한 동전 개수를 출력
<백준 9095번>
https://www.acmicpc.net/problem/9095
9095번: 1, 2, 3 더하기
각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다.
www.acmicpc.net
문제
정수 4를 1, 2, 3의 합으로 나타내는 방법은 총 7가지가 있다. 합을 나타낼 때는 수를 1개 이상 사용해야 한다.
- 1+1+1+1
- 1+1+2
- 1+2+1
- 2+1+1
- 2+2
- 1+3
- 3+1
정수 n이 주어졌을 때, n을 1, 2, 3의 합으로 나타내는 방법의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 n이 주어진다. n은 양수이며 11보다 작다.
출력
각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다.
n을 1, 2, 3의 합으로 나타내는 방법의 수를 구하려면, n-1, n-2, n-3을 1, 2, 3의 합으로 나타낼 수 있는 방법의 수를 더하면 된다. D[n] = D[n-1] + D[n-2] + D[n-3] 이 된다. 여기서 D[i]는 i를 1, 2, 3의 합으로 나타내는 방법의 수를 의미한다. 초기값은 D[1] = 1, D[2] = 2, D[3] = 4 이다.
- D[1] = 1, D[2] = 2, D[3] = 4를 초기값으로 설정다.
- 4부터 n까지 반복하면서, D[i] = D[i-1] + D[i-2] + D[i-3]을 계산한다.
- D[n]을 출력한다.
t = int(input())
d = [1, 2, 4]
for i in range(4, 11):
d.append(d[i-4] + d[i-3] + d[i-2])
for i in range(t):
n = int(input())
print(d[n-1])
배열 인덱스가 0부터 시작하기 때문에 n을 입력받을 때 d[n-1]을 출력한다.