ffinn92 / Keep-at-solve-it

꾸준히 알고리즘 풀기 위한 스터디 저장소입니다.
2 stars 3 forks source link

[220807][Tany][인프런](8-5) 동전교환 #116

Closed juni8453 closed 2 years ago

juni8453 commented 2 years ago

📌 문제

⭐️ 아이디어

🤔 고민한 내용

💪 새롭게 배운 내용

🆘 이해가 어려운 내용

❌ 해결하지 못한 이유

✅ 본인 풀이

걸린시간 : 1965ms | 💾 메모리 : 26MB (실패 코드) ⏱ 걸린시간 : 129ms | 💾 메모리 : 26MB (성공 코드)

정답 코드
package study.section8;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Collections;
import java.util.StringTokenizer;

public class Section0805 {
    static int answerCount = Integer.MAX_VALUE;
    static int changeMoney = 0;
    static Integer[] categories;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());

        StringTokenizer st = new StringTokenizer(br.readLine());
        categories = new Integer[n];

        for (int i = 0; i < categories.length; i++) {
            categories[i] = Integer.parseInt(st.nextToken());
        }
        Arrays.sort(categories, Collections.reverseOrder());

        changeMoney = Integer.parseInt(br.readLine());

        DFS(0, 0);
        System.out.println(answerCount);
    }

    // 재귀 함수를 호출하며 거슬러줘야하는 금액과 재귀의 합이 같을 때
    // answerCount 의 값과 depth 를 비교하여 더 작은 값으로 교체
    private static void DFS(int depth, int sum) {

        // 계산할 필요가 없는 부분 체크 후 바로 탈출하도록 설정
        if (sum > changeMoney) return;
        if (depth > answerCount) return;

        // 탈출 구간 및 판단 구간 설정
        // 노드를 거치면서 생기는 합이 거슬러줘야 하는 값과 같다면 판단
        // depth 자체가 이전 노드의 거슬러줄 떄 필요한 동전 갯수
        if (sum == changeMoney) {
            answerCount = Math.min(answerCount, depth);
        // 재귀 함수 동작 구간 설정
        } else {
            for (int i=0; i< categories.length; i++) {
                // 각 원소를 더하는 경우의 수 밖에 없으므로 재귀 호출 부분은 하나
                // 대신 배열을 돌면서 하나 씩 더해야 하기 때문에 for 문 사용
                DFS(depth + 1, sum + categories[i]);
            }
        }
    }
}

참고한 자료