ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [알고리즘/자바스크립트] 영역 안에 떨어진 사과와 오렌지 개수 구하기 (Count Apples and Oranges)
    Algorithm 2019. 5. 1. 15:10

    [문제] 다음과 같은 흑백 세상에 오렌지 나무와 사과나무가 있습니다. a는 사과나무의 위치를, b는 오렌지 나무의 위치를 나타냅니다. 두 나무 사이에는 Vanilla House가 있고, Vanilla House의 영역은 s에서부터 t까지로 정의됩니다.

     

    * -----a---------------------------------s---------------t----------------------------------b-----*     

    *     * *                                          ___________                                            * * 
    *     * *                                         |  Vanilla  |                                            * *
    *      |                                           |  House  |                                              |
    * -----a---------------------------------s---------------t----------------------------------b-----

     

    나무에서 과일이 다 익으면, 나무에서부터 D만큼 떨어진 곳에 떨어지게 됩니다.

    D가 음수일 경우 나무의 왼쪽으로 떨어지는 것을 의미합니다.

    D가 양수일 경우 과일은 나무의 오른쪽 방향으로 떨어집니다.

    m개의 사과와 n개의 오렌지가 익어서 떨어졌을 때, Vanilla House 영역 안에 떨어진 사과와 오렌지가 몇 개인지 배열로 반환해주세요!

    반환값은 [사과의 개수, 오렌지의 개수] 형태의 배열로 반환해주시면 됩니다!

     

    예를들어, Vanilla House가 s=7 이고 t=10 인 영역에 있고, 사과나무와 오렌지 나무가 각각 a=4, b=12인 지점에 있습니다. 그리고 m=3개의 사과와 n=3개의 오렌지가 있습니다. 각각 apples=[2, 3, -4]와 oranges=[3, -2, -4]로 떨어지는 방향이 정해졌습니다.

    그렇다면 사과는 [4 + 2, 4 + 3, 4 + (-4)]=[6, 7, 0]로 떨어지는 지점이 정해지고,

    오렌지는 [12 + 3, 12 + (-2), 12 + (-4)]=[15, 10, 8]로 떨어지는 지점이 정해집니다.

    결과적으로 Vanilla House의 영역[7, 10]에는 1개의 사과와 2개의 오렌지가 떨어지게 됩니다. 따라서 [1, 2]를 반환해주면 되겠죠!

     

    * @param {number} s

    * @param {number} t

    * @param {number} a

    * @param {number} b

    * @param {number[]} apples

    * @param {number[]} oranges

    * @return {number[]}

     


     

    function countApplesAndOranges(s, t, a, b, apples, oranges) {
      
    }

    일단 이렇게 틀을 만들어놓고 생각해보았다.

    사과 나무와 오렌지 나무 각각 같은 연산을 반복해서 해야한다.

    나무의 위치값과 과일의 위치를 더하여 개수를 세는 연산은 동일하다.

     

    즉, 동일한 연산은 따로 함수로 빼서 만들면 1번만 코드를 작성해도 

    사과의 경우, 오렌지의 경우 각각 재사용할 수 있으므로 따로 함수를 작성하였다.

     

    function countApplesAndOranges(s, t, a, b, apples, oranges) {
      // @param treeLoca {number} 나무의 위치
      // @param arr {array} 과일 떨어진 위치 배열
      function getDistance(treeLoca, arr) {
          var count = 0;
          var distance = arr.map(function(fruitLoca) {
              return treeLoca + fruitLoca;
          });
          distance.forEach(function(fruit) {
              if(fruit >= s && fruit <= t) {
                  count++;
              }
          });
          return count;
      }
    }

    바닐라 하우스 영역 안에 떨어진 과일의 개수를 구할 변수, count에 초기값 0을 할당한다.

    만약에 영역 안에 떨어진 과일이 하나도 없다면 그대로 0을 return할 것이다.

     

    두 번째로 과일이 떨어진 위치가 담긴 배열을 arr이라는 매개변수로 받아서

    tree의 위치와 과일의 위치를 더해 새로운 배열을 생성한다.

    이런 경우에는 map() 메소드를 사용하면 쉽게 만들 수 있다.

     

    새로 생성된 배열, distance를 반복문으로 돌려 

    바닐라하우스의 영역인 s와 t사이에 있는 숫자인지 확인하여

    영역 안에 존재하면 count변수를 증가시킨다.

     

    function countApplesAndOranges(s, t, a, b, apples, oranges) {
      // @param treeLoca {number} 나무의 위치
      // @param arr {array} 과일 떨어진 위치 배열
      function getDistance(treeLoca, arr) {
          var count = 0;
          var distance = arr.map(function(fruitLoca) {
              return treeLoca + fruitLoca;
          });
          distance.forEach(function(fruit) {
              if(fruit >= s && fruit <= t) {
                  count++;
              }
          });
          return count;
      }
      return [getDistance(a, apples), getDistance(b, oranges)];	// [사과의 개수, 오렌지의 개수]
    }

    (최종 return문 뒤에는 코드를 넣지 않는게 좋다고 해서 위치 수정함 - 190515)

     

    이제 사과의 개수와 오렌지의 개수를 각각 배열에 담아서 return해주면 끝!

     

    반응형

    COMMENT