결혼식

minho·2021년 10월 8일
0

코드

function solution(times){
    let res = [],
        answer = Number.MIN_SAFE_INTEGER;,
          temp = 0;
  
    for(let[x,y] of times){
      res.push([x,"s"]);
      res.push([y,"e"]);                    
    }     
  
    res.sort((a,b) => {
      if(a[0]===b[0]) return a[1].charCodeAt(0)-b[1].charCodeAt(0);
      else  return a[0]-b[0];            
    });
    console.log(res);

    for(let time of res){
      if(time[1]==="s") temp++;
      else temp--;
      answer = Math.max(answer, temp)
    }
    return answer;
}

let arr=[[13, 18], [12, 15], [15, 20], [20, 30], [5, 14]];
console.log(solution(arr));

원리

  • 흰색 숫자는 출발지점, 노란색 숫자는 끝나는 지점이다. (* 노란색 지점은 끝나는 지점으로 시간에 포함되지 않는다.)

결론부터 말하면 최고로 많이 있던 사람의 수를 묻는 문제이므로 for 문을 돌려 흰색숫자이면 +1을 노란색 숫자이면 -1을 해주면 된다.

단, 흰색숫자와, 노란색숫자가 같은경우에는 노란색 숫자를 빼줘야 한다. 왜냐하면 흰색숫자가 먼저 +1을 해버리는 경우에는 최고값이 +1 되기 때문이다.
예를들어 최고값이 2인경우에 흰색과 노란색 숫자가 동시에 나오면 최고값이 3이 되었다가 다시 2가 된다.
이 과정에서 answer = 3이 저장되기 때문이다.

코드 분석

  1. 배열 times의 [0]에는 start를 의미하는 "s"를, [1]에는 end를 의미하는 "e"를 붙여주어 새로운 배열 res(result)에 넣어준다.
  2. 배열 res의 각요소[0]을 기준으로 오름차순한다. 만약 요소[0]이 같다면 요소[1]이 "e"인 값을 먼저오게 한다.
  3. for문으로 res의 요소[1]이 "s"면 temp++해주며, "e"면 temp--해준다. 그후 answer와 temp 의 값을 비교하여 둘중 더 큰수가 answer가 되게 한다.

알게된점

sort()함수에서 charcodeAt()으로 대소를 비교하여 정렬하는 법에 대해 알게되었다.

profile
Live the way you think

0개의 댓글