백준 알고리즘

백준 (11047) - 동전0

vitamin3000 2025. 2. 22. 21:54

 

그리디 알고리즘은 탐욕 알고리즘이라고도 불리우며 쉽게 설명하면

매 선택마다 최선의 선택만을 하는 것이다.

이것이 항상 최선의 값을 찾는다는 보장은 없지만 빠른 시간안에 그 근사값을 찾는다는 것에 의의가 있다.

보통 그리디 알고리즘을 설명할 때 거스롬든을 예로 든다. 

6480원을 

5000원 ,1000원, 100원, 50원, 10원으로 가장 최소의 지폐 및 동전만 사용한다고 가정한다면,

 

가장 큰 가치의 화폐를 먼저 사용하면서 거스름돈에 대한 값을 줄여나가면 가장 최적의 해를 찾을 수 있을 것이다.

 

이때 중요한건 화폐가 일정한 배수로 증가 또는 감소한다는 것을 주목해야하는데, 

배수가 있어야 그리디 알고리즘으로 해결할 수 있다고 생각하면 된다

 

11047 문제

위 문제에서도 1, 5, 10, 50, 100 , 500 .... 50,000으로 5배, 2배, 5배 2배 .. 로 반복하면서 값이 증가하는 동전이 주어졌다

 

따라서 그리디 알고리즘으로 해결한다

 

먼저, 아래와 같이 동전의 값을 입력받고, 배열에 저장한 후 reverse 함수를 사용하여 뒤집고 가장 큰 가치의 동전부터 계산한다.

for(let i = 1; i <= n; i++)
{
    arr.push(input[i].split('\n').map(Number));
}
arr.reverse();

 

그다음 반복문을 통해 값을 계산한다

이때 화폐통해 계산할 때 는 k보다는 작고 남은 화폐중에 가장 큰 화폐를 사용해야 최적의 해를 구할 수 있다.

for(let i = 0; i < n; i++)
{
    let length = 0;
    if(k >= arr[i]) // 가장 큰 화폐를 찾는 과정
    {
        cnt += parseInt(k / arr[i]);
        length = Math.pow(10,String(arr[i][0]).length-1);
        k -= parseInt(k /= arr[i]) * arr[i];
    }
}

 

이때 예를들어 4200원이라면,

arr[i]가 1000일 때 if문이 true가 되고

4200 / 1000 한 값인 4가 cnt에 저장되고,

k값에서 4 * 1000을 빼서 나머지 거스름돈을 저장하게 하였다

'백준 알고리즘' 카테고리의 다른 글

백준 (2839) - 설탕 배달  (0) 2025.02.23
백준 (1541) - 잃어버린 괄호  (0) 2025.02.22
백준 (18870) - 좌표 압축  (0) 2025.02.20
16162  (0) 2024.09.20
11508  (3) 2024.09.20