ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [CodeKata] 프로그래머스 : 2.25(목), 구명보트
    Algorithm 2021. 2. 25. 12:54
    반응형

    🥋 Ooooth!! (Level 2)

     

    🧮 풀이

    function solution(people, limit) {
      let count = 0;
      let pairPeople = people.sort((a,b) => b-a).filter(person => person <= limit - people[people.length-1])
      count += people.length - pairPeople.length
      while (pairPeople.length !== 0) {
        const now = pairPeople.shift();
        if (now + pairPeople[pairPeople.length-1] <= limit) {
          pairPeople.pop();
        }
        count++
      }
      return count;
    }
    1. count는 구명보트의 수(정답)가 될 것이다.
    2. pairPeople은 people 배열을 내림차순 배열하고, (limit - 최소값) 보다 작은 값만 필터링했다. 이외는, 혼자 타야하는 값이므로.
    3. 그렇기 때문에, people과 pairPeople 차이는 혼자타는 보트의 개수인 것이다.
    4. 다음으로, pairPeople이 빌 때까지 while 반복문을 돌린다. 항상 맨 앞에 최대값을 shift() 한다.
    5. 만약, 맨 뒤의 값과의 합이 limit보다 작을 경우, 맨 뒤의 값도 pop() 해준다.
    6. 이 과정이 끝나면, count에 1을 더한다. 이는 둘이 타는 보트의 개수인 것이다.

     

    🖇 리뷰

    function solution(people, limit) {
      let count = 0;
      let pairPeople = people.sort((a,b) => b-a).filter(person => person <= limit - people[people.length-1])
      count += people.length - pairPeople.length
      while (pairPeople.length !== 0) {
      // 이전 풀이
        const a = pairPeople.pop();
        const b = pairPeople.findIndex(person => person <= limit - a);
        if (b !== -1) {
          pairPeople.splice(b,1);
        }
        count++
      }
      return count;
    }

    처음에는, 뒤에서 최소값을 빼고 앞에서부터 findIndex 조건을 통해, 만족하는 요소를 splice하는 로직이었다.

    이 풀이는, 정확성 테스트는 통과했지만, 효율성 테스트는 1번에서 실패가 나왔다. (다들, 여기가 마의 구간인듯..)

    아마, 최종 풀이는 배열 끝요소만 확인한 뒤 빼는 거라면, 이 풀이는 배열 전체적으로 findIndex하고 또 이를 변수에 할당하는 차이 때문인듯하다.

    반응형
Designed by Tistory.