[1차] 추석 트래픽

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

 

코딩테스트 연습 - [1차] 추석 트래픽

입력: [ "2016-09-15 20:59:57.421 0.351s", "2016-09-15 20:59:58.233 1.181s", "2016-09-15 20:59:58.299 0.8s", "2016-09-15 20:59:58.688 1.041s", "2016-09-15 20:59:59.591 1.412s", "2016-09-15 21:00:00.464 1.466s", "2016-09-15 21:00:00.741 1.581s", "2016-09-1

programmers.co.kr

 

문제 설명

이번 추석에도 시스템 장애가 없는 명절을 보내고 싶은 어피치는 서버를 증설해야 할지 고민이다. 장애 대비용 서버 증설 여부를 결정하기 위해 작년 추석 기간인 9월 15일 로그 데이터를 분석한 후 초당 최대 처리량을 계산해보기로 했다. 초당 최대 처리량은 요청의 응답 완료 여부에 관계없이 임의 시간부터 1초(=1,000밀리초)간 처리하는 요청의 최대 개수를 의미한다.

 

입력 형식

  • solution 함수에 전달되는 lines 배열은 N(1 ≦ N ≦ 2,000)개의 로그 문자열로 되어 있으며, 각 로그 문자열마다 요청에 대한 응답완료시간 S와 처리시간 T가 공백으로 구분되어 있다.
  • 응답완료시간 S는 작년 추석인 2016년 9월 15일만 포함하여 고정 길이 2016-09-15 hh:mm:ss.sss 형식으로 되어 있다.
  • 처리시간 T 0.1s, 0.312s, 2s 와 같이 최대 소수점 셋째 자리까지 기록하며 뒤에는 초 단위를 의미하는 s로 끝난다.
  • 예를 들어, 로그 문자열 2016-09-15 03:10:33.020 0.011s은 "2016년 9월 15일 오전 3시 10분 33.010초"부터 "2016년 9월 15일 오전 3시 10분 33.020초"까지 "0.011초" 동안 처리된 요청을 의미한다. (처리시간은 시작시간과 끝시간을 포함)
  • 서버에는 타임아웃이 3초로 적용되어 있기 때문에 처리시간은 0.001 ≦ T ≦ 3.000이다.
  • lines 배열은 응답완료시간 S를 기준으로 오름차순 정렬되어 있다.

 

내가 사용한 풀이
시간 계산을 ms(millisecond)를 이용하여 계산

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Date/getTime

 

Date.prototype.getTime() - JavaScript | MDN

getTime() 메서드는 표준시에 따라 지정된 날짜의 시간에 해당하는 숫자 값을 반환합니다.

developer.mozilla.org

아마 자바스크립트에서 시간을 계산할 일이 생길 때 가장 많이 쓰는 테크닉이 될 것 같다.

Date 객체를 생성한 뒤, 이를 getTime으로 ms단위 값으로 받아온다 -> 이후 계산

 

문제 코드
function compare(criteria, compare_point, cnt) {
    if(criteria <= compare_point.start_time && criteria + 999 >= compare_point.start_time)
        return 1;
    else if(criteria <= compare_point.finish_time && criteria + 999 >= compare_point.finish_time)
        return 1;
    else if(criteria > compare_point.start_time && criteria + 999 < compare_point.finish_time)
        return 1;
    else
        return 0;
}

function solution(lines) {
    let answer = 0;
    let list = [];
    
    lines.forEach(e => {
        let [day, time, prcs_time] = e.split(" ");
        let [hour, min, sec, m_sec] = time.split(/:|[.]/);
        let [last, s] = prcs_time.split(/s/);
                
        let start_time = new Date(2016, 8, 15, hour, min, sec, m_sec).getTime();
        let finish_time = new Date(2016, 8, 15, hour, min, sec, m_sec).getTime();
        start_time -= last * 1000 - 1;
                
        let data = { 
            start_time : start_time,
            finish_time : finish_time
        }
        
        list.push(data);
    });
    
    console.log(list);
    
    for(let i in list) {
        let cnt = [0, 0];
        
        //시작점을 기준으로 한 1초 범위
        for(let j in list)
            cnt[0] += compare(list[i].start_time, list[j], cnt[0]);
        
        //종료점을 기준으로 한 1초 범위
        for(let j in list)
            cnt[1] += compare(list[i].finish_time, list[j], cnt[1]);
        
        cnt.forEach(e => {
            if(e >= answer)
                answer = e;
        });
        
        console.log(cnt);
        
        cnt.fill(0);
        
    }

    return answer;
}

 

후기

다 풀고 난 지금와서 생각해보면 크게 어려운 문제는 아니었는데,, ㅋㅋㅋ 오히려 문제를 이해하는데 시간이 더 오래걸렸다.

나는 처음에 이 문제를 잘못 이해해서 입력값이 시작시간 기준으로 표현된 줄 알았는데 풀다보니 종료시간 기준이었고,,

 

compare함수 만들어놓고 왜 값이 계속 이상하게 나오나 했는데 비교 함수를 이상하게 짜서 그런거였다.

마지막에 다 와놓고 값이 오차가 생겨서 뭐때문인가 했는데, 이번엔 비교 함수에다가 case를 추가를 안해서 그런거였다.

 

단계 3짜리 문제였는데, 푸는데 시간이 오래 걸려서 만족스럽진 않지만 접근방법이 틀린 건 아니었기때문에 어느정도 만족한다.

풀다보니까 느는게 느껴진다. 더 더 많이 풀어봐야겠다

'프로그래머스 (JS)' 카테고리의 다른 글

키패드 누르기  (0) 2022.03.09
숫자 문자열과 영단어  (0) 2022.03.09
오픈채팅방  (0) 2022.03.04
문자열 압축  (0) 2022.03.03
신규 아이디 추천  (0) 2022.02.27