자료구조 공부/String

[프로그래머스] 추석트래픽

kdhoooon 2021. 5. 17. 20:28

문제


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

 

 

 

 

 

풀이


일단 String 형태를 hh:mm:ss.SSS 형태로 분석해서 시간을 저장해야한다.

 

이렇게 저장된 시간을 기준으로

현재 기준로그의 시작시간 - 1Sec + 0.001 < 비교 로그의 끝시간 && 현재 기준로그의 시작시간 >= 비교 로그의 시작시간

이 기준이 성립되면 현재 로그에서 1초내에 동시에 처리해야하는 작업이 된다.

 

시간계산의 편의를 위해서 double 형태를 1000을 곱한 int 형태로 처리하였다.

 

<전체코드>

import java.util.*;
import java.io.*;



class Solution {
    
    static class work{
        double start;
        double end;
        double time;

        work(double time){
            this.time = time;
        }
        
    }
    
    public int solution(String[] lines) {
        int answer = 1;
        
        work[] list = new work[lines.length];
        
        for(int i = 0 ; i < lines.length ; i++){
            lines[i] = lines[i].replaceAll("2016\\-09\\-15\\s","");
            
            String[] div = lines[i].split("\\s");
            div[1] = div[1].replace("s","");
            work w = new work(Double.parseDouble(div[1]) * 1000);
            
            
            String[] time = div[0].split(":");
            double timetotal = 0;
            
            for(int j = 0 ; j < time.length ; j++){
                double n = Double.parseDouble(time[j]);
                
                n *= Math.pow(60, 2 - j);
                
                timetotal += n;
            }
            
            w.end = timetotal * 1000;
            w.start = (timetotal * 1000) - w.time  + 1;
            
            list[i] = w;
        }
        
        for(int i = 0 ; i < list.length ; i++){
            
            work w = list[i];
            int start = (int)w.start;
            int oneSecBefore = start - 1000;
            
            int count = 1;
            for(int j = 0 ; j < list.length; j++){
                if(i == j)
                    continue;
                
                if(list[j].end > oneSecBefore && list[j].start <= start)
                    count++;
            }
            
            answer = Math.max(answer, count);
        }
        return answer;
    }
}