카테고리 없음

[6주차] 알고리즘

jwk818 2023. 5. 17. 13:52

<백준 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)을 이용하여 해결할 수 있다. 그리디 알고리즘은 매 단계에서 가장 최선의 선택을 하는 알고리즘으로, 이 문제에서는 가치가 가장 큰 동전부터 사용하는 것이 가장 최선의 선택이다. 따라서 가치가 큰 동전부터 사용하면서 필요한 동전 개수의 최솟값을 구할 수 있다.

  1. 입력으로 주어진 동전의 가치를 오름차순으로 정렬한다.
  2. 가치가 큰 동전부터 사용하면서, 현재 사용 중인 동전들의 가치의 합이 K와 같아지면 종료한다.
  3. 현재 사용 중인 동전들의 가치의 합이 K보다 크면 다음으로 작은 가치의 동전을 사용한다.
  4. 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 이다.

  1. D[1] = 1, D[2] = 2, D[3] = 4를 초기값으로 설정다.
  2. 4부터 n까지 반복하면서, D[i] = D[i-1] + D[i-2] + D[i-3]을 계산한다.
  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]을 출력한다.