타로는 맛있는 키위 주스를 준비했습니다. 타로는 0부터 N-1이라 이름을 붙인 N개의 병에 키위 주스를 넣었습니다. 이때 i번째의 병의 용량은 capacities[i] 리터이며 타로가 i번째 병에 넣은 키위 주스의 양을 bottles[i] 리터라고 합니다.
타로는 병에 키위 주스를 재분배하려고 하며, 0부터 M-1까지 M회 조작합니다. i번째의 조작은 타로가 병 fromId[i]부터 병 toId[i]에 키위 주스를 넣는 것을 의미합니다. 병 fromId[i]가 비어 있거나 병 toId[i]가 꽉 차 있는 순간, 타로는 더 이상 키위 주스를 넣지 않습니다.
N개의 요소를 가진 정수 배열 int[]를 리턴해주세요. 배열의 i번째 요소는 모든 주스를 쏟는 작업이 완료되고 i번째 병에 남아 있는 키위 주스의 양입니다.
문제 파악하기
1. 주스 양
병 i의 용량 = capacities[i]
병 i에 담긴 주스=bottles[i]
즉, 추가로 담을 수 있는 주스의 양은 capacities[i] - bottles[i]
2. 옮기려는 병(fromId)의 주스 양 >= 옮겨담는 병(toId)의 주스 양
toId: 꽉 참 (toId에 있던 주스의 양+ toId의 추가로 담을 수 있는 주스의 양)
fromId: 원래 있던 양 - toId의 추가로 담을 수 있는 주스의 양
3. 옮기려는 병(fromId)의 주스 양 < 옮겨담는 병(toId)의 주스 양
toId: 원래 있던 양 + fromId에 있던 주스의 양
fromId: 0 (fromId에 있던 주스의 양 - fromId에 있던 주스의 양)
위 순서대로 코드를 짜면 아래와 같다.
(C#)
private static int[] Solution(int[] capacities, int[] bottles, int[] fromId, int[] toId)
{
int n = capacities.Length;
for (int i = 0; i < fromId.Length; i++)
{
int fromNum = fromId[i];
int toNum = toId[i];
int spaceLeft = capacities[toNum] - bottles[toNum];
if (bottles[fromNum] >= spaceLeft)
{
bottles[fromNum] -= spaceLeft;
bottles[toNum] += spaceLeft;
}
else
{
bottles[toNum] += bottles[fromNum];
bottles[fromNum] = 0;
}
}
return bottles;
}
TopCoder 사이트에서 지금 C#이 컴파일이 안돼서 Java로 푸는 중..
(Java)
public class KiwiJuiceEasy {
public int[] thePouring(int[] capacities, int[] bottles, int[] fromId, int[] toId) {
for (int i = 0; i < fromId.length; i++) {
int fromB = fromId[i];
int toB = toId[i];
int pour = Math.min(capacities[toB] - bottles[toB], bottles[fromB]);
bottles[fromB] -= pour;
bottles[toB] += pour;
}
return bottles;
}
}
'Algorithm Study > TopCoder' 카테고리의 다른 글
[TopCoder] AdditionGame (Java) (0) | 2023.08.14 |
---|---|
[TopCoder] 회문 (Java, C#) (0) | 2023.08.13 |
[TopCoder] InterestingDigits (Java, C#) (0) | 2023.08.12 |
[TopCoder] Cryptography (C#, Java) (0) | 2023.08.12 |
[TopCoder] InterestingParty (C#, Java) (0) | 2023.08.11 |