일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- map
- CI/CD
- webpack
- 이분 검색
- CORS
- tailwind
- 호이스팅
- 공변성
- dfs
- ESlint
- 투포인터
- React
- recoil
- app router
- 결정 알고리즘
- Promise
- 무한 스크롤
- 반공변성
- 태그된 유니온
- Cypress
- autosize
- 인터섹션
- SSR
- useAppDispatch
- TS
- async/await
- 리터럴 타입
- 타입 좁히기
- Jest
- RTK Query
Archives
- Today
- Total
짧은코딩
프로그래머스) 광고 삽입 본문
반응형
-문제 사이트
https://school.programmers.co.kr/learn/courses/30/lessons/72414
코드
function solution(play_time, adv_time, logs) {
let pt = calSecond(play_time);
let at = calSecond(adv_time);
let times = Array(pt).fill(0);
for (let log of logs) {
let temp = log.split("-");
let s = calSecond(temp[0]);
let e = calSecond(temp[1]);
times[s]++;
times[e]--;
}
// 동시 접속자 수
for (let i = 1; i < pt; i++) times[i] += times[i - 1];
// 누적 접속자 수
for (let i = 1; i < pt; i++) times[i] += times[i - 1];
let point = 0;
let sum = times[at - 1];
for (let i = at; i < pt; i++) {
if (sum < times[i] - times[i - at]) {
sum = times[i] - times[i - at];
point = i - at + 1;
}
}
return makeTime(point);
}
function calSecond(hour) {
let time;
let temp = hour.split(":").map(Number);
time = temp[0] * 3600 + temp[1] * 60 + temp[2];
return time;
}
function makeTime(second) {
let hour = Math.floor(second / 3600);
second %= 3600;
let min = Math.floor(second / 60);
let sec = second % 60;
hour < 10 ? (hour = "0" + hour) : "";
min < 10 ? (min = "0" + min) : "";
sec < 10 ? (sec = "0" + sec) : "";
return `${hour}:${min}:${sec}`;
}
해결 방법
이 문제는 여러운 알고리즘을 필요로 하기보단 생각을 많이 해야 하는 문제라고 생각한다. 아직 이런 문제를 푸는 스킬이 부족한 거 같아서 더 많은 문제를 풀어봐야겠다고 느꼈다. 우선 시간을 초로 바꿔주는 calSecond 함수와 초를 시간 단위로 바꿔주는 makeTime 함수를 만들었다.
let pt = calSecond(play_time);
let at = calSecond(adv_time);
let times = Array(pt).fill(0);
for (let log of logs) {
let temp = log.split("-");
let s = calSecond(temp[0]);
let e = calSecond(temp[1]);
times[s]++;
times[e]--;
}
이 부분에는 times에 각 시간대별로 사람이 영상을 보면 +1, 안보면 -1을 해줬다. 따라서 times에는 그 시간대에 들어온 사람과 나간 사람을 카운팅 한 것이다.
// 동시 접속자 수
for (let i = 1; i < pt; i++) times[i] += times[i - 1];
// 누적 접속자 수
for (let i = 1; i < pt; i++) times[i] += times[i - 1];
이 부분에선 처음에 동시 접속자 수를 구했다. 그리고 for문을 한 번 더 돌면 누적 접속자 수를 구할 수 있다.
let point = 0;
let sum = times[at - 1];
for (let i = at; i < pt; i++) {
if (sum < times[i] - times[i - at]) {
sum = times[i] - times[i - at];
point = i - at + 1;
}
}
return makeTime(point);
point에 누적 접속자 수가 많은 시간을 저장하고 sum에 최대 누적 접속자 수를 저장하여 답을 구했다.
-출처
반응형
'코딩테스트 with JS > 백준, 프로그래머스' 카테고리의 다른 글
프로그래머스) 큰 수 만들기 (0) | 2023.11.12 |
---|---|
가장 먼 노드(DFS) (0) | 2023.03.25 |
프로그래머스) 합승 택시 요금(플로이드-워셜) (0) | 2023.02.28 |
프로그래머스) 순위 검색(조합, 이진 탐색, Map vs Object) (1) | 2023.02.23 |
프로그래머스) 택배 배달과 수거하기 (0) | 2023.02.09 |
Comments