Programing/Algorithm

JavaScript로 해결하는 거스름돈 문제 (Greedy Algorithm)

2025. 6. 3. 17:35
반응형

거스름돈 문제란?

"거스름돈 문제"는 주어진 금액을 가장 적은 개수의 동전으로 만들기 위한 전략을 찾는 문제입니다. 이 문제는 "탐욕 알고리즘(Greedy Algorithm)"의 대표적인 예시로 자주 사용되며, ATM 출금, 자동결제 시스템, 화폐 자동 교환기 등 다양한 실무 분야에서도 적용됩니다.


문제 정의

  • 동전 단위가 담긴 배열 coins[]와 목표 금액 amount가 주어짐
  • 목표: 동전을 조합해 총합이 amount가 되도록 하고, 사용한 동전의 개수를 최소화
  • 동전은 무한정 사용할 수 있음

예: coins = [500, 100, 50, 10], amount = 1260이면 정답은 동전 6개 (500x2, 100x2, 50x1, 10x1)


탐욕 알고리즘의 접근 방식

핵심 전략

"큰 단위 우선"의 전략을 사용합니다. 가장 큰 동전부터 가능한 만큼 사용하고, 남은 금액에 대해서 다음 큰 단위를 반복 적용합니다.

조건

  • 탐욕 알고리즘이 항상 최적 해를 보장하려면 동전 단위가 배수 관계여야 합니다.
  • 예: [10, 50, 100, 500]은 탐욕 해가 항상 최적, [5, 3]은 그렇지 않음

JavaScript 예제 코드

function greedyChange(coins, amount) {
  coins.sort((a, b) => b - a); // 큰 단위부터 정렬
  let count = 0;
  for (let coin of coins) {
    const use = Math.floor(amount / coin); // 현재 단위로 사용할 수 있는 동전 수
    count += use;
    amount -= coin * use; // 남은 금액 갱신
  }
  return amount === 0 ? count : -1; // 정확히 맞으면 개수 반환, 안 맞으면 -1
}

// 예시 실행
console.log(greedyChange([500, 100, 50, 10], 1260)); // 결과: 6
console.log(greedyChange([5, 3], 7)); // 결과: -1 (탐욕으로는 실패)

시간 복잡도 분석

  • 시간 복잡도: O(n log n) (정렬) + O(n) (반복문) → 총 O(n log n)
  • 공간 복잡도: O(1)

주의할 점

"탐욕적 선택"은 항상 최적의 해를 보장하지는 않습니다. 가능한 경우의 수가 복잡하거나, 동전 단위가 배수 관계가 아닐 때는 "동적 계획법(DP)" 같은 다른 전략이 필요합니다.

예시: 탐욕으로는 실패하는 경우

  • coins = [5, 3], amount = 7
  • 탐욕: 5 → 남은 2 → 실패
  • 실제 해: 3 + 3 + 1 = 3개 (이 경우 탐욕 실패)

실전에서의 활용 사례

  • 현금 결제 시스템의 거스름돈 계산
  • 게임 아이템 가격 단위 계산
  • 티켓 자동 발권기 금액 처리

마무리 및 학습 자료

"탐욕 알고리즘"은 문제의 성질을 파악하고 빠르게 근사 해를 구하는 데 매우 유용합니다. 하지만 항상 최적의 결과를 보장하지 않기 때문에 문제 조건에 따라 다른 알고리즘과 병행해서 비교하는 것이 좋습니다.

추천 학습 자료:

  • Greedy Algorithm Basics (GeeksforGeeks)
  • LeetCode: Coin Change Problems
반응형

'Programing > Algorithm' 카테고리의 다른 글

JavaScript로 이해하는 크루스칼 알고리즘 (Minimum Spanning Tree)  (0) 2025.06.05
JavaScript로 이해하는 병합 정렬 (Merge Sort Algorithm)  (1) 2025.06.04
JavaScript로 이해하는 회의실 배정 문제 (Meeting Room Scheduling)  (0) 2025.06.04
JavaScript로 해결하는 활동 선택 문제 (Activity Selection Algorithm)  (0) 2025.06.03
JavaScript로 해결하는 0/1 배낭 문제 (Knapsack Problem)  (1) 2025.06.03
JavaScript로 해결하는 동전 교환 문제 (Coin Change Algorithm)  (2) 2025.06.03
JavaScript로 이해하는 최적 경로 탐색 (최소 비용 경로, 다익스트라 알고리즘)  (1) 2025.06.03
JavaScript로 구현하는 피보나치 수열 (Fibonacci Sequence)  (1) 2025.06.03
'Programing/Algorithm' 카테고리의 다른 글
  • JavaScript로 이해하는 회의실 배정 문제 (Meeting Room Scheduling)
  • JavaScript로 해결하는 활동 선택 문제 (Activity Selection Algorithm)
  • JavaScript로 해결하는 0/1 배낭 문제 (Knapsack Problem)
  • JavaScript로 해결하는 동전 교환 문제 (Coin Change Algorithm)
Dongkkase
Dongkkase
개발자로 일하면서 부딪히는 문제풀이가 누군가에게 도움이 되길 바라며
    반응형
  • Dongkkase
    정집사의 개발로그
    Dongkkase
  • 전체
    오늘
    어제
    • All (478)
      • 금융 (61)
      • Programing (295)
        • Algorithm (39)
        • API (2)
        • javascript (122)
        • CSS (8)
        • HTML (10)
        • PHP (15)
        • JAVA (27)
        • JSP (17)
        • JSP 예제 (1)
        • IOS (1)
        • Android (1)
        • Sencha Touche (1)
        • bat file, cmd (0)
        • 디버깅 (2)
        • SQL (21)
        • MS-SQL (1)
        • MySQL (13)
        • 보안 (5)
      • Server (14)
        • Docker (1)
        • Windows (9)
        • Linux (3)
        • jeus (1)
      • Database (6)
      • IT 일반 (15)
      • 리뷰 (38)
        • Book (17)
        • 제품 (2)
        • 영화 소개 (11)
        • 음악 소개 (7)
      • 잡생각 (36)
        • 회고 (3)
        • 컬럼 (4)
        • 자료실 (6)
        • 낙서장 (12)
        • 위시리스트 (2)
        • WOW (1)
        • 덕 (1)
  • 인기 글

  • 최근 댓글

  • 태그

    It
    자바
    기초
    IT블로그
    IT·컴퓨터
    JavaScript
    php
    IT 관련
    블로그
    디자인패턴
    위시리스트
    읽고 싶은 책
    SQL
    사고 싶은 책
    자바스크립트
    js패턴
    iT's MY LiFE
    자바스크립트유틸
    Java
    jsp
Dongkkase
JavaScript로 해결하는 거스름돈 문제 (Greedy Algorithm)
상단으로

티스토리툴바