wisePocket

[Algorithm] 용돈 가계부 계산기 만들기 - 객체 지향 본문

Java & Algorithm

[Algorithm] 용돈 가계부 계산기 만들기 - 객체 지향

ohnyong 2023. 8. 3. 21:34

받은 용돈을 입력하고 아메리카노를 몇잔 살 수 있는지, 또한 남는 용돈은 얼마일지 확인하는 용돈 관리 프로그램 계산기

 

정해진 나의 룰에 따라서 연습 문제를 계속해서 답안을 보지 않고 스스로 풀어보고자 한다.

이번엔 문제의 문장이 길다. 코딩보다 국어가 더 어려운 경우가 있다. 문장을 짧게 잘라서 중요한 정보만 빠르게 캐치하고, 연산 부분과 출력 부분으로 구분하는 능력도 문제를 풀이하는 요령중에 하나라고 생각했다.
 
1. 문제 파악 과정
 - 필요 데이터 파악
    +--- 데이터 타입 확인

 - 필요 메서드 파악
    +--- 기본 입력부 input(){} 
             +-- 입력 값 갯수 확인
             +-- 데이터 제한조건 파악(유효성검사 while loop)
    +--- 기본 계산부 calculate(){}
             +-- 필요 연산 확인
             +-- 필요 조건 확인
    +--- 기본 출력부 output(){}
             +-- 출력할 데이터, 내용 확인
    +--- 각 메서드 별 파라미터 전달 필요 부분 확인
 
2. 코드 작성 과정
 - Main.java 실행부 생성 , Solution.java 클래스(설계도) 생성

 - 클래스 member 구현
    +--- 필요 데이터 정리에 따라 변수 선언
    +--- 기본 생성자 선언
    +--- 필요 메서드 정리에 따른 메서드 선언
             +-- input(){}과 관련된 메서드부터 작성, 유효성 체크(진입부 메서드)
             +-- calculate(){}의 실제 연산 로직 작성
             +-- output(){}의 출력 관련 정리

 - 실행부 Main.java에서 객체 인스턴스 생성 및 객체로부터 진입부 메서드 호출

1. Main.java

이제 Main 부분은 객체 생성 호출 이외엔 남는게 없다.

package Algorithm10;

import Algorithm10.Solution;

public class Main {
    public static void main(String[] args) {
        Solution solution = new Solution();
        solution.inputMoney();
    }
}

 

 

2. Solution.java

배열을 선언하고 초기화 하는것을 계속 까먹는다. 초기화 과정을 기억하자.
계속해서 유효성체크 부분을 &&로 조건을 잘못 걸고 있다. 이해가 부족하고 사용하고 있다. 다시 한번 복습겸 정리한다.

&&는 둘다 true여야 true다. and 를 곱셈이라 잘못생각해서 둘중 하나면 false라 착각하는 버릇인거 같다.
용돈은<0 -50원도 안되며 용돈은>150 160만원도 안된다. 이 조건이 둘중에 하나라도 true면 유효성체크 경고 문구가 등장하게 나타나고 있다. 그러기 때문에 둘중 하나라도 안맞으면 경고할 수 있는 ||가 맞다. 어느 하나라도 false라면 false.

내가 조건을 뒤집었기 때문에 조건문도 반대로 생각해야 한다. 이러면 어려우니 구문을 그대로 말로 해석하고 맞는지부터 확인하자.
 

package Algorithm10;

import java.util.Scanner;

public class Solution {
    /*문제 설명
머쓱이는 추운 날에도 아이스 아메리카노만 마십니다. int americanoCup
아이스 아메리카노는 한잔에 5,500원입니다. int americanoPrice
머쓱이가 가지고 있는 돈 money가 매개변수로 주어질 때, int pocketMoney <- inputMoney(){}
머쓱이가 최대로 마실 수 있는 아메리카노의 잔 수와 int maxBuy
 남는 돈을 순서대로  int leftMoney
 담은 배열을 -> arr[maxBuy, leftMoney]
 return 하도록 solution 함수를 완성해보세요.
*/
    int americanoCup;
    int americanoPrice = 5500;
    int pocketMoney;
    int leftMoney;
    int maxBuy;
    int arr[] = new int[2];
    Scanner sc = new Scanner(System.in);

    public Solution() {

    }

    //제한사항

    //0 < money ≤ 1,000,000*
    void inputMoney() {
        System.out.println("머쓱이에게 줄 용돈 금액을 입력해주세요.");
        System.out.print("(원)==>");
        while (true) {
            pocketMoney = sc.nextInt();
            if (pocketMoney < 0 && pocketMoney > 1000000) {
                System.out.println("너무 많은 금액입니다. 100만원 이하로 입력해주세요.");
                continue;
            }
            calculate(pocketMoney);
            break;
        }
    }

    void calculate(int pocketMoney) {
    //    if 10000원 주면, 1잔 가지게되고, 4500원 남는다.
    //    if 13000원 주면, 2잔 가지게되고, 2000원 남는다.
    //        pocketmoney,  americanoPrice,  leftmoney
    //     10000/5500 = 1.818181..
    //     13000/5500 = 2.3636.. => 2 => americanoCup
    //    내림이 필요하다. Math
    //    Math.floor() 그럼, 잔수 해결, 남은돈? pocketMoney - (americanoCup*americanoPrice)
    //    돈을 double로 실수표현 강제형변환하고, 그 결과를 내려서, int로 형변환해서 cup에 담자.
        americanoCup = (int)Math.floor((double)pocketMoney/americanoPrice);
        leftMoney = pocketMoney - (americanoCup*americanoPrice);
        //담자.
        arr[0]=americanoCup;
        arr[1]=leftMoney;
        output(arr);
    }

    void output(int arr[]) {
        System.out.printf("머쓱이는 용돈을 %,d원 받았는데,\n이걸로 아메리카노 %d개를 사먹을 수 있어요.\n다 사먹으면 %,d원 남겠네요.",pocketMoney,arr[0],arr[1]);
    }
}