본문 바로가기
프로그래밍/코딩 공부

코딩 공부[Q1]

by W.C. 2018. 1. 26.
728x90

키위쥬스

------------------------------------------------------------------------------------------------------------------------------------------------------------

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


[정의 : 클래스와 함수 정의]


Class : KiwiJuiceEasy

Java : 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개의 요소가 있는 배열입니다.

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


변수 fromId와 toId는 0~(N-1) 사이의 값입니다. 이때 N은 변수 capacities의 항목 개수입니다. 변수 fromId[i]와 toId[i]는 서로 다른 값을 갖습니다.


[예시 : 입력 데이터와 출력 데이터]

1. capacities = {20, 20}

bottles = {5,8}

fromId = {0}

toId = {1}

Returns :{0, 13}

2. capacities = {10, 10}

bottles = {5,8}

fromId = {0}

toId = {1}

Returns : {3,10}

3. capacities = {30, 20,10}

bottles = {10, 5,5}

fromId= {0,1,2}

toId = {1,2,0}

Returns : {10,10,0}

4. capacities = {14,35,86,58,25,62}

bottles = {6, 34, 27, 38, 9, 60}

fromId = {1,2,4,5,3,3,1,0}

toId ={0,1,2,4,2,5,3,1}

Returns : {0,14,65,35,25,35}


스칼라 언어로 프로그램 하시오































-----------------------------------------------------------------[Answer]------------------------------------------------------------------------------------


무언가 좀 더 깔삼한 방법이 있을 것 같지만...


일단 우선 적으로 만든 것(Scala)


def thePouring(capapcities:Array[Int], bottles:Array[Int], fromId:Array[Int], toId:Array[Int]) : Array[Int] = {

for(nl <- 0 until fromId.length ) {
val fromNum = fromId(nl) //시작 넘버
val toNum = toId(nl) //to 넘버

val addJuice = bottles(toNum) + bottles(fromNum)

if(capapcities(toNum) - addJuice <0) {
bottles(toNum) = capapcities(toNum)
bottles(fromNum) = addJuice - capapcities(toNum)
} else {
bottles(fromNum) = 0
bottles(toNum) = addJuice
}
}

bottles
}



------------------------------------------------------------[Answer2]---------------------------------------

if 문은 적게 쓸수록 좋다 그거는 프로그래머라면 다들 알고 있는 상식!!


이건 내가 한 것이 아니다...


def thePouring2(capapcities:Array[Int], bottles:Array[Int], fromId:Array[Int], toId:Array[Int]) : Array[Int] = {

for(nl <- fromId.indices ) {
val sum = bottles(fromId(nl)) + bottles(toId(nl))
bottles(toId(nl)) = Math.min(sum, capapcities(toId(nl)))
bottles(fromId(nl)) = sum - bottles(toId(nl))

}

bottles
}


결국은 수학적 사고 방식이 필요 한 것인가...


때론 단순한게 좋지만...


Input이 크지 않는 데이터라면 속도 차이는 거의 없다고 봐도 무방하지만


Input이 커질수록 if문이 있고 없고의 차이는 크다...


하지만 무엇이 딱 옳다고 말 할 수는 없는 것 같다.


코드는 줄일 수 있다면 좋지만 그 만큼 가독성이 떨어지기도 하니 말이다..



출처: http://hunamkyu.tistory.com/21?category=745256 [훈남규]

'프로그래밍 > 코딩 공부' 카테고리의 다른 글

코딩공부[Q3]  (0) 2018.01.26
코딩공부[Q2]  (0) 2018.01.26