반응형
Notice
Recent Posts
Recent Comments
Link
관리 메뉴

짧은코딩

결혼식 본문

반응형

문제 풀이

처음 내가 생각한 풀이

  function solution(times) {
    let answer = 0;
    let ary = times.slice();

    ary.sort((a, b) => a[0] - b[0]);

    let count = 0;
    for (let i = 0; i < times.length - 1; i++) {
      let max = ary[i][1];
      for (let j = i; j < times.length; j++) {
        if (ary[j][0] < max) {
          count++;

          if (count > answer) answer = count;
        } else {
          count = 0;
          break;
        }
      }
    }

    return answer;
  }

내가 생각한 풀이는 리스트를 들어온 시간 순서대로 정렬하고 처음 들어온 사람의 퇴장 시간을 max에 저장한다. 그리고 다음 사람의 들어온 시간과 비교해서 count를 올려주는 방식으로 풀었다.

하지만 이런 방식으로 풀게되면 for문을 2번 사용해서 비효율적이다.

강사님 풀이

  function solution(times) {
    let answer = 0;
    let timeLine = [];
    let count = 0;

    times.forEach((item) => {
      timeLine.push([item[0], "s"]);
      timeLine.push([item[1], "e"]);
    });

    timeLine.sort((a, b) => {
      if (a[0] === b[0]) {
        return a[1].charCodeAt() - b[1].charCodeAt();
      }
      return a[0] - b[0];
    });

    timeLine.forEach((item) => {
      if (item[1] === "s") {
        count++;
        answer = Math.max(answer, count);
      } else {
        count--;
      }
    });

    return answer;
  }

모든 사람의 시간을 들어온 시간은 "s", 나간 시간은 "e"로 해서 timeLine 배열에 넣는다. 그러고 시간 순서대로 정렬하는데, 이때 중요한 것은 나간 시간인 "e"를 가진 시간이 들어간 시간 "s"보다 앞에 있어야한다. 왜냐하면 나간 시간부터는 그 사람은 없는 사람으로 취급되기 때문이다. 그리고 forEach를 통해서 "s"면 count 1을 올려주고 answer에 최대 인원을 최신화 시킨다. "e"면 count를 1 낮춰준다.

charCodeAt는 아스키 코드를 구하는 메서드이다.

반응형
Comments