STUDIO_54

키위 주스 KiwiJuice 본문

Algorithm 말/배열

키위 주스 KiwiJuice

JeeNi 2020. 4. 3. 18:00

[문제]

타로는 맛있는 키위 주스를 준비했습니다. 타로는 0부터 N-1이라 이름을 붙인 N개의 병에 키위 주스를 넣었습니다. 이때 i번째의 병의 용량은 capacities[i] 리터이며 타로가 i번째 병에 넣은 키위 주스의 양을 bottle[i] 리터라고 합니다.

 

타로는 병에 키위 주스를 재분배하려고 하며, 0부터 M-1까지 M회 조작합니다. i번째의 조작은 타로가 병 fromId[i]부터 병 toId[i]에 키위 주스를 넣는 것을 의미합니다. 병 fromId[i]가 비어 있거나 병 toId[i]가 꽉 차 있는 순간, 타로는 더 이상 키위 주스를 넣지 않습니다.

 

N개의 요소를 가진 정수 배열 int[]를 리턴해 주세요. 배열의 i번째 요소는 모든 주스를 쏟는 작업이 완료되고 i번째 병에 남아 있는 키위 주스의 양입니다.

 

[문제 해설]

옮기는 작업은 크게 두 가지로 구분

  1. 주스를 모두 옮겼는데 넘치지 않고 전부 들어간 경우
  2. 주스를 모두 옮겼는데 넘쳐버린 경우

1. 주스를 모두 옮겼는데 넘치지 않고 전부 들어간 경우

옮길 주스의 양 <= 기존 주스 병의 남은 용량

  • 이동량은 옮길 주스의 양
  • 기존 주스 양에 이동량을 더한다.
  • 옮길 주스에서 이동량을 뺀다.(옮길 주스를 비운다)

2. 주스를 모두 옮겼는데 넘쳐버린 경우

옮길 주스의 양 > 기존 주스 병의 남은 용량

  • 이동량은 옮길 주스의 남은 용량
  • 기존 주스의 남은 주스 양에 이동량을 더한다.(기존 주스의 병을 가득 채운다)
  • 옮길 주스에서 이동량을 뺀다

 

[소스 코드]

package array;

class KiwiJuice {

    public int[] thePouring(int[] capacities, int[] bottles, int[] fromId, int[] toId) {

        for (int i = 0; i < fromId.length; i++) {

            int f = fromId[i];
            int t = toId[i];
            int space = capacities[t] - bottles[t];

            if (space >= bottles[f]) {
                int vol = bottles[t];
                bottles[t] += vol;
                bottles[f] = 0;
            }else {
                int vol = space;
                bottles[t] += vol;
                bottles[f] -= vol;
            }
        }

        return bottles;
    }
}

'Algorithm 말 > 배열' 카테고리의 다른 글

[백준 no.2920] 음계  (0) 2020.04.09