programmers/Kakao

추석 트래픽 [자바]

Meluu_ 2025. 11. 25. 10:50

 

🧫 문제 분석

✔️ 출처

추석 트래픽  level 3

📖 문제

 

로그로 주어지는 시간대를 파싱해서 

각각의 요청 시간과 완료 시간을 구해서

요청 시간 기준으로 로그들을 정렬한 다음

 

[요청 시간, 요청시간 + 1초] ,

[요청완료시간, 요청완료시간 + 1초] 

두 범위 안에 드는 모든 로그들을 카운팅한다.

 

시간이 소숫점 단위로 나오므로 항상 정수형으로 바꿔주자

부동소수 오차 때문에 정확한 비교가 불가능하다. 

 

여기서는 ms 단위로 다 변경하였다. 이로써 정렬도 쉽고 파싱도 어렵지 않다.

 

 

 


🔅 문제 풀이

import java.util.*;

class Solution {
    // 시작 지점 + 1초, 끝지점 + 1초 범위 안에 들어오는 모든 로그들 탐색
    
    public int solution(String[] lines) {
        List<long[]> list = new ArrayList<>();
        int answer = 0;
        
        // 모든 로그의 시간대를 ms로 변환
        for (int i = 0; i < lines.length; i++) {
            String[] logDetail = lines[i].split(" ");
            
            String processingTime = logDetail[2].substring(0, logDetail[2].length() - 1);
            long end = toMs(logDetail[1]); // ms로 변화
            long duration = (long)(Double.parseDouble(processingTime) * 1000);
            long start = end - duration + 1;
            
            list.add(new long[] {start, end});
        }
        
        // 시작 시간순으로 정렬
        list.sort((a, b) -> Long.compare(a[0],b[0]));
        
        
        for (int i = 0; i < list.size(); i++) {
            long[] cur = list.get(i);
            
            // 시작 지점 + 1초 부분 탐색
            long s = cur[0];
            long e = s + 999; // 1초 구간 [s ~ s+999] 가 1000ms 
            int cnt = 0;
            
            for (int j = 0; j < list.size(); j++) {
                long[] tmp = list.get(j);
                
                if (s <= tmp[1] && tmp[0] <= e) {
                    cnt++;
                }
            }
            
            answer = Math.max(answer, cnt);
            
            // 끝 시간대 탐색 
            s = cur[1];
            e = s + 999;
            cnt = 0;
            
            for (int j = 0; j < list.size(); j++) {
                long[] tmp = list.get(j);
                
                if (s <= tmp[1] && tmp[0] <= e) {
                    cnt++;
                }
            }
            
            answer = Math.max(answer, cnt);
            
        }
        
        
        return answer;
    }
    
    private long toMs(String time) {
        String[] times = time.split(":");
        
        return (Long.parseLong(times[0]) * 3600 * 1000) 
            + (Long.parseLong(times[1]) * 60 * 1000) 
            + (long)(Double.parseDouble(times[2]) * 1000);
        
    }
}

 

 

🔅 리팩토링

❗ 오답노트 / 필요한 지식

  1. 소수점 문제는? 정수로!

 

'programmers > Kakao' 카테고리의 다른 글

길 찾기 게임 [자바]  (0) 2025.10.29
셔틀버스 [자바]  (0) 2025.10.23
보석 쇼핑 [자바]  (1) 2025.10.16
다단계 칫솔판매 [자바]  (0) 2025.10.13
K진수에서 소수개수 구하기  (0) 2025.09.30