알고리즘 문제 풀기

프로그래머스: [1차] 추석 트래픽- javascript(시간함수, 구간 최대값)

Fo_rdang 2024. 7. 14. 21:29
반응형

문제 출처 

https://school.programmers.co.kr/learn/courses/30/lessons/17676

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 풀이 힌트 

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
    }
}
반응형