문제 출처
https://school.programmers.co.kr/learn/courses/30/lessons/17676
문제 풀이 힌트
1. 주어진 시간을 밀리초로 변환한다
2. 변환한 시간으로 시작 시간을 구한다.
3. 시작 시간은 START로, 끝난 시간은 END로 배열에 넣는다. (이때 끝난 시간에 +1000 밀리 세컨즈 시간을 더해야 한다.)
4. 시간을 기준으로 오름차순 정렬을 한다.
5. let count = 0 으로 설정한 뒤, 'START'가 나오면 count+1, 'END'가 나오면 count-1을 한다.
6. count수가 업데이트 될 때마다 max 값을 찾는다.
7. return max
끝난 시간에 +1000 밀리 세컨즈 시간을 더해야 하는 이유
예시를 들어 설명해보자
아래와 같이 startTime이 1초, endTIme이 3초 인 로그 경우와
startTime이 3.1초, endTime이 4초인 로그 경우가 있다고 하자.
질문하겠다.
동시에 처리하고 있는 로그의 수는?
1초씩 확인해서 함께 처리하고 있는 로그 수는?
=> 동시에 처리하고 있는 로그 수는 0개이고, 1초씩 확인해서 함께 처리하고 있는 로그 수는 1개이다.
아래 그림과 같이 동시에 처리하고 있는 로그는 없다. => 따라서 0개.
그런데, 시간을 기준으로 보면 어떻게 되는가?
=> 아래 그림과 같이 3초와 4초 사이에 처리하고 있는 로그 수는 1개가 된다.
문제에서 원하는 것은 ,
시간 관점이다.
따라서, endTime이 3초일 때, 사실 이 로그는 1초를 더해서 4초까지 커버하는 로그가 된다.
정답 풀이 코드
function solution(lines) {
let arr = [];
lines.forEach((line) => {
let [date, times, T] = line.split(' ')
T = transT(T)
let end_time = transTime(times)
let start_time = end_time - T + 1
arr.push([start_time, 0])
arr.push([end_time + 999, 1])
})
arr.sort((a,b) => {
if(a[0] === b[0]) return a[1] - b[1]
else return a[0]-b[0]
})
console.log(arr)
let cnt = 0;
let max = Number.MIN_SAFE_INTEGER
arr.forEach((el) => {
if(el[1] === 0) cnt++;
else cnt--
max = Math.max(max, cnt )
})
return max;
function transT(str){
return str.slice(0,-1)*1000
}
function transTime(str){
let [hh, mm, ss] = str.split(':')
return hh * 3600 * 1000 + mm *60 * 1000 + ss*1000
}
}
//초당 최대 처리량 : 1초간 처리하는 요청들 중 최대 개수
//lines 반복문 돌면서 시간 start, end 구하기
//- 시간 변환 함수
//- end 시간은 +1000이 되어야 한다.
//해당 배열 정렬하기 숫자 오름차순, 같다면? start 먼저
Only 코드 추가
function solution(lines) {
let arr = [];
lines.forEach((line) => {
let [date, times, T] = line.split(' ')
T = transT(T)
let end_time = transTime(times)
let start_time = end_time - T + 1
arr.push([start_time, 0])
arr.push([end_time + 999, 1])
})
arr.sort((a,b) => {
if(a[0] === b[0]) return a[1] - b[1]
else return a[0]-b[0]
})
console.log(arr)
let cnt = 0;
let max = Number.MIN_SAFE_INTEGER
arr.forEach((el) => {
if(el[1] === 0) cnt++;
else cnt--
max = Math.max(max, cnt )
})
return max;
function transT(str){
return str.slice(0,-1)*1000
}
function transTime(str){
let [hh, mm, ss] = str.split(':')
return hh * 3600 * 1000 + mm *60 * 1000 + ss*1000
}
}
'알고리즘 문제 풀기' 카테고리의 다른 글
프로그래머스: 매칭 점수 - javascript (정규식 끝끝판왕...) (0) | 2024.07.17 |
---|---|
프로그래머스: 산 모양 타일링 - javascript(dp) (0) | 2024.07.15 |
프로그래머스:코딩테스트 공부 - javascript(dp) (0) | 2024.07.13 |
프로그래머스: 표 병합 - javascript(Union-Find) (0) | 2024.07.11 |
프로그래머스 : 블록 이동하기 - javascript (bfs) (0) | 2024.07.01 |