🧫 문제 분석
✔️ 출처
📖 문제
로그로 주어지는 시간대를 파싱해서
각각의 요청 시간과 완료 시간을 구해서
요청 시간 기준으로 로그들을 정렬한 다음
[요청 시간, 요청시간 + 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);
}
}
🔅 리팩토링
❗ 오답노트 / 필요한 지식
- 소수점 문제는? 정수로!
'programmers > Kakao' 카테고리의 다른 글
| 길 찾기 게임 [자바] (0) | 2025.10.29 |
|---|---|
| 셔틀버스 [자바] (0) | 2025.10.23 |
| 보석 쇼핑 [자바] (1) | 2025.10.16 |
| 다단계 칫솔판매 [자바] (0) | 2025.10.13 |
| K진수에서 소수개수 구하기 (0) | 2025.09.30 |