JavaScript로 해결하는 동전 교환 문제 (Coin Change Algorithm)

2025. 6. 3. 09:36·Programing/Algorithm
반응형

동전 교환 문제란?

"동전 교환 문제"는 주어진 동전의 종류와 금액이 있을 때, 해당 금액을 만들기 위한 최소 동전 개수를 구하는 대표적인 "동적 계획법(DP) 문제"입니다. 이 문제는 실생활에서도 다양한 곳에서 활용됩니다. 예를 들어 자동 결제 시스템, POS 단말기, 게임 내 재화 계산 등에서 최적의 동전 개수를 계산해야 할 때 사용됩니다.


문제 조건

  • 동전의 종류: 정수 배열 형태 (예: [1, 2, 5])
  • 목표 금액: 양의 정수 (예: 11)
  • 목적: 해당 금액을 만들기 위한 "최소 동전 개수" 구하기

불가능한 경우에는 -1을 반환합니다.


자바스크립트로 구현하는 DP 기반 풀이

function coinChange(coins, amount) {
  // "DP 배열"을 amount + 1 크기로 초기화 (모든 값은 무한대, 단 dp[0] = 0)
  const dp = new Array(amount + 1).fill(Infinity);
  dp[0] = 0;

  // 각 금액을 만들 수 있는 최소 동전 개수를 계산
  for (let i = 1; i <= amount; i++) {
    for (let coin of coins) {
      if (i - coin >= 0) {
        // 현재 금액에서 coin을 뺀 위치의 최소값 + 1
        dp[i] = Math.min(dp[i], dp[i - coin] + 1);
      }
    }
  }

  // 최종 결과 반환 (불가능한 경우 -1 처리)
  return dp[amount] === Infinity ? -1 : dp[amount];
}

// 예시 실행
console.log(coinChange([1, 2, 5], 11)); // 출력: 3 (5+5+1)
console.log(coinChange([2], 3));        // 출력: -1

코드 흐름 설명

  1. 초기에는 "모든 값"을 무한대로 설정해 어떤 조합도 불가능하다고 가정합니다.
  2. dp[0]은 금액이 0일 때 필요한 동전 수는 0이므로 0으로 초기화합니다.
  3. 금액 1부터 목표 금액까지 차례로 탐색하며,
    • 각 금액 i에 대해 사용 가능한 동전 coin을 시도해
    • i - coin 위치의 최적값 + 1을 비교하여 "최소 동전 개수"를 갱신합니다.
  4. dp[amount]에 값이 무한대가 남아 있다면 해당 금액을 만들 수 없다는 의미로 -1을 반환합니다.

DP 배열 변화 과정 시각화

아래는 coins = [1, 2, 5], amount = 11인 경우에 대해 DP 배열이 갱신되는 과정을 시각적으로 표현한 표입니다. 각 셀은 해당 금액을 만들기 위한 최소 동전 개수를 나타냅니다.

이 표를 참고하면 각 단계별 계산 과정을 직관적으로 이해할 수 있습니다.


시간 복잡도 분석

  • 시간 복잡도: O(amount * coins.length)
  • 공간 복잡도: O(amount)

동전의 개수가 적고, 목표 금액이 클 경우에도 선형적으로 탐색이 가능하여 효율적인 풀이로 간주됩니다.


활용 팁 및 주의사항

  • "DP 배열" 초기화 시 Infinity를 사용하는 것이 핵심입니다.
  • 동전 종류가 중복되거나 정렬되지 않아도 무방합니다.
  • 문제에 따라 "동전 순서"나 "중복 사용 여부"가 달라질 수 있으므로 조건을 명확히 확인해야 합니다.

마무리 및 추천 자료

"동전 교환 문제"는 "최적화 문제"의 대표 예시로, 다양한 알고리즘 풀이 방식과 접근 전략을 연습하기에 적합한 주제입니다. 특히 "동적 계획법(Dynamic Programming)"을 처음 접하는 학습자에게 매우 유용한 연습 문제가 될 수 있습니다.

다음 리소스를 통해 추가 학습을 추천합니다:

  • LeetCode Coin Change
  • freeCodeCamp - DP 소개 강의
  • replit JS 실습 플랫폼

 

반응형

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

JavaScript로 이해하는 회의실 배정 문제 (Meeting Room Scheduling)  (0) 2025.06.04
JavaScript로 해결하는 활동 선택 문제 (Activity Selection Algorithm)  (0) 2025.06.03
JavaScript로 해결하는 거스름돈 문제 (Greedy Algorithm)  (1) 2025.06.03
JavaScript로 해결하는 0/1 배낭 문제 (Knapsack Problem)  (1) 2025.06.03
JavaScript로 이해하는 최적 경로 탐색 (최소 비용 경로, 다익스트라 알고리즘)  (1) 2025.06.03
JavaScript로 구현하는 피보나치 수열 (Fibonacci Sequence)  (1) 2025.06.03
JavaScript로 구현하는 소수 판별 (Prime Check)  (0) 2025.05.26
JavaScript로 구하는 최대공약수와 최소공배수 (GCD / LCM)  (0) 2025.05.26
'Programing/Algorithm' 카테고리의 다른 글
  • JavaScript로 해결하는 거스름돈 문제 (Greedy Algorithm)
  • JavaScript로 해결하는 0/1 배낭 문제 (Knapsack Problem)
  • JavaScript로 이해하는 최적 경로 탐색 (최소 비용 경로, 다익스트라 알고리즘)
  • JavaScript로 구현하는 피보나치 수열 (Fibonacci Sequence)
Dongkkase
Dongkkase
개발자로 일하면서 부딪히는 문제풀이가 누군가에게 도움이 되길 바라며
    반응형
  • Dongkkase
    정집사의 개발로그
    Dongkkase
  • 전체
    오늘
    어제
    • All (456) N
      • 금융 (61)
      • Programing (279) N
        • Algorithm (38) N
        • API (2)
        • javascript (121)
        • CSS (6)
        • HTML (10)
        • PHP (15)
        • JAVA (27)
        • JSP (17)
        • JSP 예제 (1)
        • IOS (1)
        • Android (1)
        • Sencha Touche (1)
        • bat file, cmd (0)
        • 디버깅 (2)
        • SQL (17)
        • MS-SQL (1)
        • MySQL (12)
      • Server (14)
        • Docker (1)
        • Windows (9)
        • Linux (3)
        • jeus (1)
      • Database (5)
      • IT 일반 (15)
      • 리뷰 (1) N
        • Book (17)
        • 제품 (2) N
        • 영화 소개 (11)
        • 음악 소개 (7)
      • 잡생각 (31)
        • 회고 (2)
        • 자료실 (6)
        • 낙서장 (12)
        • 위시리스트 (2)
        • WOW (1)
        • 덕 (1)
  • 인기 글

  • 최근 댓글

  • 태그

    위시리스트
    js패턴
    SQL
    It
    자바스크립트
    jsp
    Java
    기초
    읽고 싶은 책
    IT 관련
    블로그
    자바스크립트유틸
    IT블로그
    사고 싶은 책
    디자인패턴
    IT·컴퓨터
    php
    iT's MY LiFE
    자바
    JavaScript
  • hELLO· Designed By정상우.v4.10.3
Dongkkase
JavaScript로 해결하는 동전 교환 문제 (Coin Change Algorithm)
상단으로

티스토리툴바