● 동전을 거슬러주자 다만 part1과 달리 이번엔 동전의 개수가 정해져 있다.
문제 (출처: 자바의 정석 연습문제)
public class Practice07 {
public static void main(String[] args) {
if (args.length != 1) {
System.out.println("USAGE: java Exercise5_7 3120");
System.exit(0);
}
int money = Integer.parseInt(args[0]); //커맨드라인으로 받은 변수는 문자열이므로 정수로 변환한다.
System.out.println("money=" + money);
int[] coinUnit = { 500, 100, 50, 10 };
int[] coin = { 5, 5, 5, 5 };
/* (1) . 아래의 로직에 맞게 코드를 작성하시오
1. (money) (coinNum) . 금액 을 동전단위로 나눠서 필요한 동전의 개수 를 구한다
2. coin coinNum . 배열 에서 만큼의 동전을 뺀다
( coin .) 만일 충분한 동전이 없다면 배열 에 있는 만큼만 뺀다
3. (coinNum) . 금액에서 동전의 개수 와 동전단위를 곱한 값을 뺀다
*/
System.out.println(coinUnit[i]+"원: "+coinNum);
}
if (money > 0) {
System.out.println(" 거스름돈이 부족합니다");
System.exit(0);
}
System.out.println("=남은 동전의 개수 =");
for (int i = 0; i < coinUnit.length; i++) {
System.out.println(coinUnit[i] + " 원:" + coin[i]);
}
}
}
위에서 주석 처리한 부분에 들어갈 코드를 적어보자
1) 필요한 동전의 개수를 구해보자
coinNum = money / coinUnit [i]
1-a) 만약 coinNum이 5보다 크다면 필요한 코인은 무조건 5가 되고 남은 코인은 0이다.
1-b) 그 외의 상황에선 coinNum = money / coinUnit [i]이고 남은 돈 money %=coinUnit [i]으로 저장한다.
반복, 조건문으로 구현
↓↓↓
for(int i=0;i <coinUnit.length;i++){
int coinNum =0;
coinNum = money / coinUnit [i];
if (coinNum> coin [i]) {
// money -= coinUnit[i]*coin [i]; -- (1)
coinNum = 5;
coin[i] = 0;
} else {
coin-=coinNum;
// money %=coinUnit [i]; --(2)
}
money -= coinUnit [i]*coin [i]; -- (1)과 (2)를 한 번에 처리한 코드
}
2) 코드의 알고리즘을 살펴보자
2-a) 총 실행 횟수는 동전의 종류만큼 실행한다. money = 입력받은 돈
2-b) 필요한 코인의 개수(coinNum)를 구한다.
2-c-1) coinNum이 5를 초과할 때 -> coin [i] = 0; / coinNum = 5; 로 초기화,
나머지 돈(money -= coinNum [i]*coin [i];) 저장
2-c-2) coinNum이 5 거나 넘지 않을 때 -> coinNum은 b에서 구했으니 건들 필요가 없다, coin [i]-=coinNum;
나머지 돈(money -= coinNum [i]*coin [i];) 저장 ->> 중복 코드는 따로 빼서 묶어주자
2-d) if문을 빠져나와서 거스르고 남은 돈(money -= coinNum [i]*coin [i];) 초기화
2-a) d에서 저장한 money값을 가지고 반복 실행
Answer
package Chapter05;
public class Practice07 {
public static void main(String[] args) {
if (args.length != 1) {
System.out.println("USAGE: java Exercise5_7 3120");
System.exit(0);
}
int money = Integer.parseInt(args[0]); //커맨드라인으로 받은 변수는 문자열이므로 정수로 변환한다.
System.out.println("money=" + money); // 입력된 돈
int[] coinUnit = { 500, 100, 50, 10 }; // 준비된 동전의 종류
int[] coin = { 5, 5, 5, 5 }; // 준비된 돈의 갯수
for (int i = 0; i < coinUnit.length; i++) { // 500,100,50,10마다 거슬러 줘야 하므로 배열의 길이만큼 실행
int coinNum = 0; // 1)필요한 동전의 갯수 초기화
coinNum = money/coinUnit[i]; //2)필요한 동전의 갯수 계산
if(coinNum>coin[i]) { //3)우리가 갖고있는 동전의 갯수는 한정되어 있으므로 조건식을 걸어야 함
coinNum=coin[i];
coin[i]=0;
}else {
coin[i]-=coinNum;
}
money-=coinNum*coinUnit[i]; //4) 남은돈을 계산후 money에 넣어준다.
// 1~4) 반복
System.out.println(coinUnit[i]+"원: "+coinNum);
}
if (money > 0) { //for문의 반복이 끝나고 10원의 계산이 끝났을때 money가 남아있지 않으면 돈이 부족하지 않게 거슬러주므로 money=0이어서 if문이 실행되지 않는다.
System.out.println(" 거스름돈이 부족합니다");
System.exit(0); // . 프로그램을 종료한다
}
System.out.println("=남은 동전의 개수 =");
for (int i = 0; i < coinUnit.length; i++) {
System.out.println(coinUnit[i] + " 원:" + coin[i]);
}
}
}
'Java > Daily-Java' 카테고리의 다른 글
[Array] 버리긴 아까운 백준 오답 (feat.MultiArray,No.4434) (0) | 2021.04.21 |
---|---|
[Array] 2차원 배열의 90도 회전 (0) | 2021.04.20 |
[Array] 동전 거슬러주기 _ Part 1 (0) | 2021.04.15 |
[Array] 배열을 응용한 " * " 출력 예제 (0) | 2021.04.13 |
[Array] 2차원 배열 응용 (0) | 2021.04.13 |