ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 코딩 공부[Q1]
    프로그래밍/코딩 공부 2018. 1. 26. 10:45
    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 [훈남규]

    728x90

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

    코딩공부[Q3]  (0) 2018.01.26
    코딩공부[Q2]  (0) 2018.01.26
Designed by Tistory.