해당 알고리즘 자료는 제가 직접 푼 것도 있지만 다른 분들의 풀이과의 비교를 통해 더 나은 알고리즘을 공부하기 위해 정리한 것들입니다.
https://programmers.co.kr/learn/courses/30/lessons/17676
풀이 : 트래픽의 시작시간과 끝시간을 구해 시간을 기준으로 1초동안의 트래픽의 수를 계산
import java.util.*;
class Solution {
public int solution(String[] lines) {
int answer = 0;
int[] startTimes = new int[lines.length];
int[] endTimes = new int[lines.length];
getTimes(lines, startTimes, endTimes); // 시작시간, 끝 시간을 계산
for(int i = 0 ; i < lines.length ; ++i) {
int cnt = 0;
int startOfSection = startTimes[i]; // 시작시간 기준
int endOfSection = startOfSection + 1000;
for(int j = 0 ; j < lines.length ; ++j) {
if(startTimes[j] >= startOfSection && startTimes[j] < endOfSection) {
cnt++;
} else if(endTimes[j] >= startOfSection && endTimes[j] < endOfSection) {
cnt++;
} else if(startTimes[j] <= startOfSection && endTimes[j] >= endOfSection) {
cnt++;
}
}
answer = cnt > answer ? cnt : answer;
}
for(int i = 0 ; i < lines.length ; ++i) {
int cnt = 0;
int startOfSection = endTimes[i]; // 끝시간 기준
int endOfSection = startOfSection + 1000;
for(int j = 0 ; j < lines.length ; ++j) {
if(startTimes[j] >= startOfSection && startTimes[j] < endOfSection) {
cnt++;
} else if(endTimes[j] >= startOfSection && endTimes[j] < endOfSection) {
cnt++;
} else if(startTimes[j] <= startOfSection && endTimes[j] >= endOfSection) {
cnt++;
}
}
answer = cnt > answer ? cnt : answer;
}
return answer;
}
private void getTimes(String[] lines, int[] startTimes, int[] endTimes) {
for(int i = 0 ; i < lines.length ; ++i) {
String[] log = lines[i].split(" ");
String[] responseTime = log[1].split(":");
int processingTime = (int)(Double.parseDouble(log[2].substring(0, log[2].length() - 1)) * 1000);
int startTime = 0; // 시작시간
int endTime = 0; // 끝 시간
endTime += Integer.parseInt(responseTime[0]) * 60 * 60 * 1000;
endTime += Integer.parseInt(responseTime[1]) * 60 * 1000;
endTime += (int)(Double.parseDouble(responseTime[2]) * 1000);
startTime = endTime - processingTime + 1;
startTimes[i] = startTime;
endTimes[i] = endTime;
}
}
}