Java/Daily-Java

[Array] 동전 거슬러주기 _ Part 2 (응용)

모모토 2021. 4. 15. 14:09

● 동전을 거슬러주자 다만 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]);
		}

	}
}