인프런 커뮤니티 질문&답변

je님의 프로필 이미지
je

작성한 질문수

자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)

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

코드 리뷰 부탁드립니다

작성

·

208

0

const solution = (m, songs) => {
  let lt = Math.max(...songs),
    rt = songs.reduce((prev, cur) => prev + cur);
  let mid = parseInt((lt + rt) / 2);
  let nowCount;
  let minMinutes = Number.MAX_SAFE_INTEGER;

  const getCount = (minutes, songs) => {
    let count = 0;
    let remainMinutes = 0;
    for (let song of songs) {
      if (remainMinutes < song) {
        count++;
        remainMinutes = minutes - song;
      } else {
        remainMinutes -= song;
      }
    }

    return count;
  };

  while (lt <= rt) {
    nowCount = getCount(mid, songs);
    console.log(mid, nowCount, minMinutes);
    if (nowCount > m) {
      lt = mid + 1;
    } else {
      rt = mid - 1;
      // if (nowCount === m) minMinutes = Math.min(minMinutes, mid);
      minMinutes = mid;
    }
    mid = parseInt((lt + rt) / 2);
  }

  return minMinutes;
};

먼저 getCount 부분을 다르게 작성해봤는데 반례가 있을지 궁금합니다.

그리고 제 원래 코드는 while문 내에서 구한 nowCount값이 m과 같을 때만 minMinutes(정답)을 minMinutes와 mid 중 더 작은 값으로 대입해줬는데, nowCount가 m보다 작거나 같은 경우에 무조건 정답으로 대입해도 괜찮은 이유가 무엇인가요?

답변 1

0

김태원님의 프로필 이미지
김태원
지식공유자

안녕하세요^^

반례가 없어 보입니다.

nowCount가 m보다 작다는 것은 mid용량을 가진 DVD로 m이하의 장수로 모든 노래를 순서를 유지하면서 저장할 수 있다는 의미입니다. 그래서 mid 용량을 일단 답으로 하고 더 좋은 답을 찾가 이분검색으로 좁혀 들어가는 것입니다. 좁혀 들어가다가 더 작은 정답이 될 수 있는 mid가 나오면 이 값으로 정답을 교체해가는 방식입니다.

je님의 프로필 이미지
je

작성한 질문수

질문하기