멋쟁이 사자처럼 2기 150일간의 기록

CurrencyCnt 자바 화폐 계산 알고리즘

정현3 2022. 10. 4. 14:16

우리 회고 14팀 인규님의 코드이다.

import java.util.Scanner;

public class Problem3 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("금액을 넣으세요 [숫자입력]");
        int money =0;
        try {
            money = scanner.nextInt();
            if(money%10!=0){
                System.out.println("최소 10원단위로 입력해주세요.");
                return ;
            }
            calculateMoney(money);
        }catch (Exception e){
            System.out.println("숫자만 입력하세요 프로그램을 다시 시작해주세요");
            return ;


        }

        static void calculateMoney(int money){
            int[] moneyUnit = {50000, 10000, 5000, 1000, 500, 100, 50, 10};
            for (int i : moneyUnit) {
                System.out.println(i + "원" + (money / i) + "개");
                money%=i;
            }
        }
    }

우리 회고팀 인규님의 코드의 forEach문을 for문으로 바꾸어 보았다. 생각보다 오류가 생겼고 그 과정에서 int i = 0으로 할 경우 moneyUnit[0]이 되어 50000원이 포함되어 연산되지만 (money / i) 가 0으로 나누는 꼴이 되어 Exception이 발생하였고, int i = 1로 할경우 Exception이 발생하지는 않지만 moneyUnit[1]이 되어 50000원이 연산되지 않는 상황이 발생하였다.
그래서 System.out.println(moneyUnit[i] + "원" + (money / moeyUnit[i]) + "개"); 로 바꿔주었고 money = money % i 도 money = money % moneyUnit[i]로 바꾸어주었다.

import java.util.Scanner;

class CurrencyCount3 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("금액을 넣으세요 : [숫자입력]");

        int money = 0;

        //유효성 검사
        try {
            money = scanner.nextInt();
            if (money % 10 != 0) {
                System.out.println("최소 10원 단위로 입력해주세요.");
                return;
            }
            //메서드 실행
            calculateMoney(money);
            
        } catch (Exception e) { //Exception : 배열의 범위를 넘어가서 연산을 하는경우 발생한다.
            System.out.println("숫자만 입력하세요. 프로그램을 다시 시작해주세요");
            return;
        }
    }
    static void calculateMoney(int money) {
        int[] moneyUnit = {50000, 10000, 1000, 500, 100, 50, 10}; //크기가 7인 배열
        
        for (int i = 0; i < moneyUnit.length; i++) {
            System.out.println(moneyUnit[i] + "원" + (money / moneyUnit[i]) + "개");
            money = money % moneyUnit[i];
        }

    }
}

김경록 강사님의 생각하는 방식의 접근법을 살려준 코드이다.

import java.util.Scanner;

/**
 * 현금으로 돈을 받고 25000원을 거슬러 주어야 합니다
 * 5만원 짜리는 몇장, 만원짜리는 몇장, 5천원짜리는 몇장을 거슬러주어야 할까요?
 * -> 나머지 연산을 할 수 있는가?
 */
class CurrencyCount2 {
    public static void main(String[] args) {

        int currency50000 = 50000;
        int currency10000 = 10000;
        int currency5000 = 5000;
        int currency1000 = 1000;
        int currency500 = 500;
        int currency100 = 100;

        //raw 익히지 않은
        Scanner sc = new Scanner(System.in);
        System.out.println("화폐의 액수를 입력해주세요 : ");
        int refund = sc.nextInt();

        /**
         * 25,000원을 각 화폐 단위로 나누었을 때 몫과 나머지를 출력하는 코드를 작성해주세요
         * 각 화폐 단위는 위와 같이 각각 변수로 선언해주세요.
         */

        //25,000원을 50,000원으로 나누었을 때 몫, 나머지
        System.out.printf("5만원권 %d장\n", refund / currency50000);
        //25,000원을 10,000원으로 나누었을 때 몫, 나머지
        System.out.printf("1만원권 %d장, 나머지 : %d\n", refund / currency10000, refund % currency10000);
        //5,000원 권은 한장만 나오게 하고 싶다. 왜냐하면 20,000원은 만원짜리 두개로 처리했기 때문이다.
        //refund = refund - (currency10000 * 2);
        refund = refund % 10000;

        //refund는 25,000원을 1원으로 나눈 나머지로 값을 업데이트 한다.
        refund = refund % 5000;
        System.out.printf("5천원권 %d장, 나머지 : %d\n", refund / currency5000, refund % currency5000);
        refund = refund % 1000;
        System.out.printf("1천원권 %d장, 나머지 : %d\n", refund / currency1000, refund % 1000);
        refund = refund % 500;
        System.out.printf("5백원 %d개, 나머지 : %d\n", refund / currency500, refund % 500);
        refund = refund % 100;
        System.out.printf("1백원 %d개, 나머지 : %d\n", refund / currency100, refund % 100);
    }
}