min

선택 트랙 알고리즘 [7일차] 본문

알고리즘

선택 트랙 알고리즘 [7일차]

minprogramming 2023. 5. 29. 19:26

<문제>

문제

준규가 가지고 있는 동전은 총 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원을 만드는데 필요한 동전 개수의 최솟값을 출력한다.

 

<풀이 밎 회고>

 

이 문제를 처음 접했을 때는 약수를 먼저 알아야 한다는 것을 알았다.

그럼 먼저 약수에 대해서 살펴보자

내가 생각하는 약수는 다음과 같다.

약수는 1과 자기 자신을 제외한 수들중에서 나눠지는 수를 의미한다.

예를 들어 24가 있다고 하자

그럼 24와 1을 제외한 수들 중에서 나눠지는 수

즉 2,3,4,6,8,12를 뜻한다.

 

자 그럼 한번 문제를 보도록 하자

문제를 보면 지금 약수의 갯수를 먼저 준다.

그리고 다음 줄에 약수를 쭉 보여준다.

우리는 여기서 약수중에서 가장 작은수와 가장 큰수를 구해서

그 수들을 곱해주면 답이 나오기에 이런 형식으로 로직을 구현하면 풀 수 있다.

여기서 중요한 것은 약수를 알아야 한다는 점에서 이 문제가 어렵게도 느껴질 수 있다.

그래서 우리는 약수에 대해서 먼저 알아야한다는 것을 확인할 있다.

<정답 코드>

N = int(input())
data = list(map(int,input().split()))
print(min(data) * max(data))