- 키위주스 문제
타로는 맛있는 키위주스를 준비했습니다. 타로는 0부터 n-1이라 이름을 붙인 n개의 병에 키위주스를 넣었습니다.
이때 i 번째 병의 용은 capacities[i] 리터이며 타로가 i번째 병에 넣은 키위주스의 양을 bottles[i] 리터라고 한다
타로는 병에 키위주스를 재분배하려고 하며 0부터 m-1까지 m 회 조작합니다.
병 fromId[i] 가 비어 있거나 병 toId[i] 가 꽉 차 있는 순간 타로는 더 이상 키위주스를 넣지 않는다.
8개의 요소를 가진 정수배열 int[]를 리턴해주세요 배열의 i번째 요소는 모든 주스를 쏟는 작업이 완료되고 i 번째 병에 남아있는 키위 주스의 양입니다.
문제는 fromId 라는 병에서 toId라는 병으로 키위주스를 옮겨담는 문제이다.
이때 크게 두가지 상황이 나올 수 있다.
- toId 병이 더 작을경우
- toId 병이 꽉 차고 fromId병에 옮겨담고 남은 주스가 존재한다.
- toId 병에 다 들어갈경우
- toId 병에 fromId병의 모든 주스가 들어간다.
public class kiwi {
/**
* 타로는 맛있는 키위주스를 준비했습니다. 타로는 0부터 n-1이라 이름을 붙인 n개의 병에 키위주스를 넣었습니다.
* 이때 i 번째 병의 용은 capacities[i] 리터이며 타로가 i번째 병에 넣은 키위주스의 양을 bottles[i] 리터라고 한다
* 타로는 병에 키위주스를 재분배하려고 하며 0부터 m-1까지 m 회 조작합니다.
* 병 fromId[i] 가 비어 있거나 병 toId[i] 가 꽉 차 있는 순간 타로는 더 이상 키위주스를 넣지 않는다.
* 8개의 요소를 가진 정수배열 int[]를 리턴해주세요 배열의 i번째 요소는 모든 주스를 쏟는 작업이 완료되고 i 번째 병에
* 남아있는 키위 주스의 양입니다.
*/
public static int[] thePouring1(int[] capacities, int[] bottles, int[] fromId, int[] toId) {
// 0 ~ N-1 번째 병의 용량은 capacities[0] ~ capacities[N-1]
// 0 ~ N-1 번째에 넣은 키위주스 양 bottle[0] ~ capacities[N-1]
//단순히 반복 작업, 조건문을 적게 하는 것이 중요하다.
//수용량을 비교하여 반복한다.
for(int i = 0; i < fromId.length ; i++) {
int f = fromId[i]; // 주스를 뺄 병
int t = toId[i]; //주스를 넣을 병
// 주스를 옮겼을때 넘쳐버린경우 > 수용량보다 옮길 주스양이 많다
if(capacities[t] <= bottles[f] + bottles[t]) {
// f의 남은 용량은 t의 수용량에서 t가 가진 양을 뺀 후 f를 빼면 f에 남은 용량이다.
bottles[f] = bottles[f] - (capacities[t] - bottles[t]);
bottles[t] = capacities[t];
}else {
// 수용량이 더 크다면 f의 전체 양을 t에 부어준다
bottles[t] = bottles[f] + bottles[t];
bottles[f] = 0;
}
}
return bottles;
}
public static int[] thePouring2(int[] capacities, int[] bottles, int[] fromId, int[] toId) {
// 조건문을 줄인 경우
for(int i =0; i< fromId.length ; i++) {
int f = fromId[i]; // 주스를 뺄 병
int t = toId[i]; //주스를 넣을 병
// 옮길 주스의 양과 기존 주스병의 남은 용량을 비교하면 둘중 작은 것이 이동량이 된다
// Math.min은 둘 중 작은 값을 리턴한다.
int vol = Math.min(bottles[f], capacities[t] - bottles[t]);
//이동량 만큼을 기존 주스의 양에서 빼거나 더해준다.
bottles[f] -= vol;
bottles[t] += vol;
}
return bottles;
}
//메인
public static void main(String[] args) {
//1
int[] capacities = {30,20,10};
int[] bottles = {10,5,5};
int[] fromId = {0,1,2};
int[] toId = {1,2,0};
//2
int[] capacities2 = {14,35,86,58,25,62};
int[] bottles2 = {6,34,27,38,9,60};
int[] fromId2 = {1,2,4,5,3,3,1,0};
int[] toId2 = {0,1,2,4,2,5,3,1};
int[] result = thePouring1(capacities, bottles, fromId, toId);
int[] result2 = thePouring2(capacities2, bottles2, fromId2, toId2);
// int[] result3 = thePouring3(capacities3, bottles3, fromId3, toId3);
System.out.print("입력값 1 결과 : ");
for(int i =0; i< result.length ; i++) {
System.out.print(result[i]+" ");
}
System.out.println("\n");
System.out.print("입력값 2 결과 : ");
for(int i =0; i< result2.length ; i++) {
System.out.print(result2[i]+" ");
}
}
}