일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- React
- recoil
- 공변성
- Cypress
- Jest
- 리터럴 타입
- 태그된 유니온
- dfs
- 반공변성
- tailwind
- 타입 좁히기
- CI/CD
- TS
- CORS
- Promise
- useAppDispatch
- 인터섹션
- 투포인터
- async/await
- app router
- 결정 알고리즘
- webpack
- 무한 스크롤
- RTK Query
- 이분 검색
- SSR
- 호이스팅
- map
- autosize
- ESlint
Archives
- Today
- Total
짧은코딩
결혼식 본문
반응형
문제 풀이
처음 내가 생각한 풀이
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는 아스키 코드를 구하는 메서드이다.
반응형
'코딩테스트 with JS > 자바스크립트 알고리즘 문제풀이(인프런)' 카테고리의 다른 글
마구간 정하기(결정 알고리즘), 이분검색 (0) | 2022.12.15 |
---|---|
뮤직비디오(결정 알고리즘), 이분검색 (0) | 2022.12.13 |
LRU(Least Recently Used) (0) | 2022.12.05 |
공주 구하기 (0) | 2022.09.09 |
쇠막대기 (0) | 2022.09.08 |
Comments