IF - 결혼식

Goody·2021년 4월 28일
0

알고리즘

목록 보기
93/122

문제

현수는 다음 달에 결혼을 합니다.
현수는 결혼식 피로연을 장소를 빌려 3일간 쉬지 않고 하려고 합니다.
피로연에 참석하는 친구들 N명의 참석하는 시간정보를 현수는 친구들에게 미리 요구했습니다.
각 친구들은 자신이 몇 시에 도착해서 몇 시에 떠날 것인지 현수에게 알려주었습니다.
현수는 이 정보를 바탕으로 피로연 장소에 동시에 존재하는 최대 인원수를 구하여 그 인원을
수용할 수 있는 장소를 빌리려고 합니다. 여러분이 현수를 도와주세요.
만약 한 친구가 오는 시간 13, 가는시간 15라면 이 친구는 13시 정각에 피로연 장에 존재하는
것이고 15시 정각에는 존재하지 않는다고 가정합니다.


예시

Input1Output
[[14, 18], [12, 15], [15, 20], [20, 30], [5, 14]]2

풀이 및 회고

  • 같은 시간대에 몇 명의 사람들이 있었는지 검사하는 문제이다.
  • 방문객 온 시간을 기준으로 오름차순으로 정렬하되, 온 시간이 같으면 간 시간을 기준으로 정렬한다.
  • 정렬된 2차원 배열을 flat() 메서드로 1차원 배열로 만들면, 배열의 원소를 앞에서부터 하나씩 살펴봤을 때 [사람1의 방문시각, 사람2의 방문시각, 사람1의 떠난시각, ...] 이런 배열이 만들어진다.
  • 이 배열을 다시 [[시각, '방문'], [시각, '떠남']] 와 같은 2차원 배열로 만들면, 배열의 원소가 '방문'을 포함하고 있을 땐 count를 +1 하고, '떠남'을 포함하고 있을 땐 -1 해서 최대 방문객 수를 구할 수 있다.

코드

const solution = (arr) => {
    const answer = [];
    const visitRecord = [];
    let counter = 0;

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

    const people = arr.flat();
    for(let i = 0; i < people.length; i++) {
        if(i % 2 === 0) visitRecord.push([people[i],'s']);
        else visitRecord.push([people[i], 'e']);
    }

    visitRecord.sort((a,b) => a[0]-b[0]);
    visitRecord.forEach((record) => {
        if(record[1] === 's') {
            counter++;
            answer.push(counter);
        }
        else {
            counter--;
            answer.push(counter);
        }
    })
const max = Math.max(...answer);
    return max;
    
}

0개의 댓글