받은 용돈을 입력하고 아메리카노를 몇잔 살 수 있는지, 또한 남는 용돈은 얼마일지 확인하는 용돈 관리 프로그램 계산기
정해진 나의 룰에 따라서 연습 문제를 계속해서 답안을 보지 않고 스스로 풀어보고자 한다.
이번엔 문제의 문장이 길다. 코딩보다 국어가 더 어려운 경우가 있다. 문장을 짧게 잘라서 중요한 정보만 빠르게 캐치하고, 연산 부분과 출력 부분으로 구분하는 능력도 문제를 풀이하는 요령중에 하나라고 생각했다.
1. 문제 파악 과정 - 필요 데이터 파악 +--- 데이터 타입 확인
- 필요 메서드 파악 +--- 기본 입력부 input(){} +-- 입력 값 갯수 확인 +-- 데이터 제한조건 파악(유효성검사 while loop) +--- 기본 계산부 calculate(){} +-- 필요 연산 확인 +-- 필요 조건 확인 +--- 기본 출력부 output(){} +-- 출력할 데이터, 내용 확인 +--- 각 메서드 별 파라미터 전달 필요 부분 확인
2. 코드 작성 과정 - Main.java 실행부 생성 , Solution.java 클래스(설계도) 생성
- 클래스 member 구현 +--- 필요 데이터 정리에 따라 변수 선언 +--- 기본 생성자 선언 +--- 필요 메서드 정리에 따른 메서드 선언 +-- input(){}과 관련된 메서드부터 작성, 유효성 체크(진입부 메서드) +-- calculate(){}의 실제 연산 로직 작성 +-- output(){}의 출력 관련 정리
배열을 선언하고 초기화 하는것을 계속 까먹는다. 초기화 과정을 기억하자. 계속해서 유효성체크 부분을 &&로 조건을 잘못 걸고 있다. 이해가 부족하고 사용하고 있다. 다시 한번 복습겸 정리한다.
&&는 둘다 true여야 true다. and 를 곱셈이라 잘못생각해서 둘중 하나면 false라 착각하는 버릇인거 같다. 용돈은<0 -50원도 안되며 용돈은>150 160만원도 안된다. 이 조건이 둘중에 하나라도 true면 유효성체크 경고 문구가 등장하게 나타나고 있다. 그러기 때문에 둘중 하나라도 안맞으면 경고할 수 있는 ||가 맞다. 어느 하나라도 false라면 false.
내가 조건을 뒤집었기 때문에 조건문도 반대로 생각해야 한다. 이러면 어려우니 구문을 그대로 말로 해석하고 맞는지부터 확인하자.
package Algorithm10;
import java.util.Scanner;
publicclassSolution{
/*문제 설명
머쓱이는 추운 날에도 아이스 아메리카노만 마십니다. 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[] = newint[2];
Scanner sc = new Scanner(System.in);
publicSolution(){
}
//제한사항//0 < money ≤ 1,000,000*voidinputMoney(){
System.out.println("머쓱이에게 줄 용돈 금액을 입력해주세요.");
System.out.print("(원)==>");
while (true) {
pocketMoney = sc.nextInt();
if (pocketMoney < 0 && pocketMoney > 1000000) {
System.out.println("너무 많은 금액입니다. 100만원 이하로 입력해주세요.");
continue;
}
calculate(pocketMoney);
break;
}
}
voidcalculate(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);
}
voidoutput(int arr[]){
System.out.printf("머쓱이는 용돈을 %,d원 받았는데,\n이걸로 아메리카노 %d개를 사먹을 수 있어요.\n다 사먹으면 %,d원 남겠네요.",pocketMoney,arr[0],arr[1]);
}
}