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

8.회의실 배정

crab. 2022. 7. 6. 09:03

📌강의 정리

회의 시작시간과 회의의 진행시간을 기준으로 정렬하면 최대 횟수를 구하는 데 반례들이 있기 때문에 회의가 끝나는 시간을 기준으로 정렬한다.

이때 회의의 끝나는 시간이 같은 경우의 회의들은 회의의 시작시간이 빠른 순서로 정렬한다.

정렬이 끝나면 반복을 하되 매 반복마다 et변수에 끝나는 시간을 넣어 시작시간이 et보다 큰경우에만 answer++을 한다.(처음 et는 0)

 

📌느낀점

정말 오랜만에 알고리즘에게 제대로 당한 문제였다.

그만큼 얻어갈게 많은 아주 좋은 문제였다고 생각한다.

우선 나는 회의 시작시간과 진행시간으로는 정렬할 생각을 했는데 끝나는 시간으로는 정렬할 생각을 하지 못했다.

그것이 이 알고리즘을 제대로 풀지 못한 제일 큰 이유인데

해결방법으로는 역시 손코딩으로 종이에 알고리즘을 그려가며 우선 윤곽을 잡는 것이 맞다.

이후에 et를 이용해서 et를 업데이트하며 회의의 수를 구하는 알고리즘 또한 알고리즘의 정의에 부합하는 아주 좋은 풀이였던 것 같다.

모든 수를 반복하는게 꼭 나쁘지만은 않을 수 있다.

항상 모든 경우의 수를 염두해두고 간결하고 확실한, 그러면서도 복잡도를 챙기는 알고리즘을 생각하자.

 

//나의 코드
<html>
  <head>
    <meta charset="UTF-8" />
    <title>출력결과</title>
  </head>
  <body>
    <script>
      function solution(meeting) {
        let answer = 0;
        meeting.sort((a, b) => a[0] - b[0]);
        meeting.sort((a, b) => a[1] - a[0] - (b[1] - b[0]));
        console.log(meeting);
        for (let i = 0; i < meeting.length - 1; i++) {
          answer++;
          if (meeting[i][1] <= meeting[i + 1][0]) i++;
        }
        return answer;
      }

      //회의를 정렬하되 순서가 처음에는
      //인덱스 0을 비교하여 오름차순으로 정렬하고
      //그 다음에는 인덱스 1에서 0을 뺀 수가 작은 순서로
      //정렬한다. 이후 반복을 통해 최대값을 구한다.
      let arr = [
        [1, 4],
        [2, 3],
        [3, 5],
        [4, 6],
        [5, 7],
      ];
      console.log(solution(arr));
    </script>
  </body>
</html>

//강사님 코드
<html>
  <head>
    <meta charset="UTF-8" />
    <title>출력결과</title>
  </head>
  <body>
    <script>
      function solution(meeting) {
        let answer = 0;
        meeting.sort((a, b) => {
          if (a[1] === b[1]) return a[0] - b[0];
          else return a[1] - b[1];
        });
        let et = 0;
        for (let x of meeting) {
          if (x[0] >= et) {
            answer++;
            et = x[1];
          }
        }
        return answer;
      }

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