JS 알고리즘 문제풀이/섹션 7. 정렬과 그리디, 결정알고리즘

11.뮤직비디오(결정알고리즘)

crab. 2022. 7. 9. 08:48

📌강의 정리

이분 탐색의 범위는 주어진 배열이 아닌 DVD의 용량크기이다.

따라서 최소 9에서부터 최대 45까지에서 음악이 나누어지는게 가능할때 mid값을 구해야한다.

처음 mid는 lt + rt / 2 이고 그걸 전체 노래목록에서 하나씩 더하면서 mid보다 커질때 cnt를 ++하고

sum에는 x를 넣어주어 sum을 초기화하고 다시 더해간다.

그러면 mid 값에서의 dvd개수가 나오고 그게 주어진 음반보다 작으면 우선 answer에 할당시켜준뒤

다시 이분탐색을 해서

  1. count해준게 주어진 dvd개수보다 작거나 같은지
    1. 작거나 같다면 answer를 그 mid값으로 업데이트한다.
    2. 이후 rt값을 mid -1로 바꿔준다.
  2. 그렇지 않다면 lt값을 mid + 1로 바꿔준다.

해주고 lt가 rt보다 커지면 반복을 멈추고 이분탐색으로 효율적으로 모든 dvd 길이의 경우의수를 봤기에 answer를 반환한다.

 

📌느낀점

이제까지의 문제중 가장 어려우면서 제일 심오하고 알고리즘의 본질(?)에 근접한 문제이지 않았나 싶다.

강의를 보면서 이게 이렇게 풀릴 수가 있구나 생각이 들었고

왜 나는 이분탐색을 계속 주어진 음반배열에만 사용할 생각을 하고

사고를 더 확장해서 dvd 길이에는 사용할 생각을 못했는지 그게 아쉽다.

이번 문제는 진짜 틈틈이 계속 리마인드하며 잘 기억해 놔야 겠다.

정말 좋은문제이고 중요한 문제이다.

 

//나의 코드
<html>
  <head>
    <meta charset="UTF-8" />
    <title>출력결과</title>
  </head>
  <body>
    <script>
      function count(songs, capacity) {
        let cnt = 1,
          sum = 0;

        return cnt;
      }

      function solution(m, songs) {
        let answer;
        const result = songs.reduce((sum, curr) => sum + curr);
        const avarage = result / m;
        let lt = 0,
          sum = 0;
        let rt = songs.length;
        for (let x of songs) {
          let mid = (lt + rt) / 2;
          for (let i = lt; i < mid; i++) {
            sum += songs[i];
          }
          if (sum > avarage) rt = mid;
          else if (sum < avarage) lt = mid;
          else lt = i;
        }
        console.log(avarage);
        return answer;
      }

      //우선 노래들을 전부 더한 다음에 m으로 나누어
      //평균값을 구한다.
      //이후 이분탐색을 이용해서 평균에 최대한 가깝게들 합을 구하고
      //그 합들중 가장 큰값을 출력한다.
      let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
      console.log(solution(3, arr));
    </script>
  </body>
</html>
//강사님 코드
<html>
  <head>
    <meta charset="UTF-8" />
    <title>출력결과</title>
  </head>
  <body>
    <script>
      function count(songs, capacity) {
        let cnt = 1,
          sum = 0;
        for (let x of songs) {
          if (sum + x > capacity) {
            cnt++;
            sum = x;
          } else sum += x;
        }
        return cnt;
      }

      function solution(m, songs) {
        let answer;
        let lt = Math.max(...songs);
        let rt = songs.reduce((a, b) => a + b, 0);
        while (lt <= rt) {
          let mid = parseInt((lt + rt) / 2);
          if (count(songs, mid) <= m) {
            answer = mid;
            rt = mid - 1;
          } else {
            lt = mid + 1;
          }
        }
        return answer;
      }

      let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
      console.log(solution(3, arr));
    </script>
  </body>
</html>

'JS 알고리즘 문제풀이 > 섹션 7. 정렬과 그리디, 결정알고리즘' 카테고리의 다른 글

12.마구간 정하기(결정알고리즘)  (0) 2022.07.11
10.이분검색  (0) 2022.07.08
9.결혼식  (0) 2022.07.07
8.회의실 배정  (0) 2022.07.06
7.좌표 정렬  (0) 2022.07.05