알고리즘/다시 풀어 보기
프로그래머스 [Lv. 3] 거스름돈 {언어 : JavaScript} [다시 풀어 보기]
스위태니
2024. 7. 4. 17:43
문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/12907?language=javascript
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
정답 코드
function solution (n, money) {
const MOD = 1000000007; // 결과를 나누는 모듈러 값 (큰 수 계산 시 오버플로우 방지)
const dp = Array(n+1).fill().map(() => 0); // 길이가 n+1인 배열 dp를 0으로 초기화
dp[0] = 1; // dp[0]은 1로 설정 (금액 0을 만들 수 있는 경우는 아무 동전도 사용하지 않는 1가지 경우)
for(let m of money){ // 각 동전 m에 대해 반복
for(let i = m; i < n+1; i++){ // m부터 n까지 반복
dp[i] = (dp[i] + dp[i - m]) % MOD; // 현재 금액 i를 만들 수 있는 경우의 수를 업데이트
};
};
const answer = dp[n]; // dp[n]에 저장된 값 (주어진 금액 n을 만들 수 있는 경우의 수)을 answer에 치환
return answer;
}
풀이 방법
- 기본 설정
- MOD = 1000000007은 결과를 큰 수로 나눠서 계산하기 위해 사용한다.
- dp 배열은 n+1 크기로 만들어지며, 모든 값을 0으로 초기화한다. dp[i]는 금액 i를 만들 수 있는 경우의 수를 저장한다.
- dp[0]은 1로 설정되는데, 이는 금액 0을 만들 수 있는 경우가 아무 동전도 사용하지 않는 한 가지 경우임을 의미한다.
- 동전 종류별 경우의 수 계산
- 각 동전 m에 대해, 금액 m부터 n까지 반복하며 dp 배열을 업데이트한다.
- dp[i]를 dp[i - m]을 더한 값으로 업데이트합니다. 이는 금액 i를 만들기 위해 동전 m을 추가하는 경우의 수를 의미한다.
- 이렇게 하면 모든 동전 조합을 고려하게 되며, dp 배열은 각 금액을 만들 수 있는 모든 경우의 수를 저장하게 된다.
- 결과 반환
- 최종적으로 dp[n]에는 주어진 금액 n을 만들 수 있는 경우의 수가 저장되어 있으며, 이 값을 반환한다.
느낀점
- dp가 어려운 점은 규칙을 찾는 부분이다.
- 규칙 찾는데도 1시간 넘게 걸리는데 dp 문제 나오면 쉽지 않을 것 같다.