본문 바로가기

알고리즘

키위주스

반응형

타로는 맛있는 키위 주스를 준비했습니다. 타로는 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번째 병에 남아 있는 키위주스의 양입니다.

 

병의용량 capaities[0] capaities[1] capaities[2] .. capaities[N-1]
주스용량 bottles[0] bottles[1] bottles[2]   bottles[N-1]

[클래스와 함수 정의]

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

 

[제약조건: 매개변수 범위]

capacities -> 2~50개의 요소가 있는 배열이다, 각 요소는 1~1000000 사이의 값을 갑는다

bottles -> capacities 와 같은 수의 요소가 있는 배열 , bottles[i] 는 capacities[i]에 들어가 있는 주스를 의미한다.

fromId - > 1~ 50 개의 요소가 있는 배열

todoId -> fromId 와 같은 수의 요소가 있는 배열입니다.

 

이문제를 풀면서 가장 햇갈렸던건 fromId와 toId가 가장 햇갈렷다 ㅜㅜ 알고보니 병의 위치를 구하기 위해서 사용하는거였는데 엉뚱하게 주스가 옮겨지는 양과 옮겨지고 나서 더한값이라고 착각했다.. 

 

입력값 ( thePoring(new int[]{ 10, 10 }, new int[]{ 10, 8 }, new int[]{ 0 }, new int[]{ 1 })));) 

 

 

문제를 풀어 보면 f  와 t 로 병의 위치를 구한다  f는 타로가 키위주스를 가지고 있는병 , t는 기존에 있던 병 ! 이라고 생각하면된다.

 

 

int f = fromId[f]
int t = toId[t]

 

 

space를 구하면되는데 capacities 병의용량 - bottles(주스용량) 코드를 보면 [t] 라고 되어 있으니까 기존에 있던 병의 공간값을 구하면된다! 0번째가 아닌 1번째의 병의 용량과 기존에 담겨 있던 주스용량을 빼서 남은공간을 구하면된다

 

space = capacities[t] - bottles[t]

 

 if조건으로

space가 0번째병에 담긴 쥬스 용량보다 크다면 기존에 있던 주스양과 이동하는 주스의 양을 더하면된다.

이동하는 주스의양은 vol이라는 변수를 줬다. 그러면 답은 [0.13] 이나온다 

 

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

 

 

기존에 남아 있는 병용량이 이동하는 주스양보다 적다면 공간을 vol에 넣어주고 기존에 있던 주스양과 남아 있는 병용량을 더하면

꽉차게 된다. 문제에서는 넘치면 멈춘다고 했다. 그러면 꽉차고 남은 주스량 을 계산해보면 값을 확인할수있다. 

 

첫번째 문제도 겨우 풀었다 손으로 몇번을 풀어봤는지 모르겟다..

 

 

 

책에서는 간단한 알고리즘이 정리되어 있다 math.min으로 최솟값을 구해서 기존의 주스양과 이동하는 주스양을 계산해주는 방식이다 .

이책에서는 조건문이 필요 이상으로 많으면 그만큼 코드의 양이 많아지고 입력에 따라 처리되지 않는 부분이 발생합니다. 이때는 Example에서 오류가 검출되지 않으므로 버그를 찾기 힘들어집니다. 조건문을 가능한 조금 사용하고 동일한 작업을 여러번 하지 않는 것이 중요합니다. 라고 되어 있다.

if문이 많아지면 코드양이 많아지는건 사실이다 근데난 아직  if문이 뭔가.. 확실해지니까? 안심이된다고 해야하나? ..ㅋㅋㅋ 약간 이런느낌이다

반응형

'알고리즘' 카테고리의 다른 글

TopCoder 전체 탐색! (암호)  (0) 2020.11.12
TopCoder(전체탐색) 즐거운파티  (0) 2020.11.11
추가적인 프로그래밍 지식  (0) 2020.11.09
반드시 필요한 프로그래밍 지식!  (0) 2020.11.09
알고리즘 시작!  (0) 2020.11.09