import java.util.*;
class Solution {
public int solution(String[] lines) {
int answer = 0;
int len = lines.length;
int[] starts = new int[len];
int[] ends = new int[len];
//파싱
for(int i=0;i<len;i++){
String[] str=lines[i].split(" ");
int during= dobleChange(str[2]);
int end = parsing(str[1]);
int start = end -during+1;
starts[i] = start;
ends[i] = end;
}
//순회 시작배열,종료배열 전달
//리턴 값으로 최대값 체킹
//순회2 겹치는 구간 체킹
for(int i=0;i<len;i++){
answer = Math.max(answer, canInclud(starts,ends,starts[i],starts[i]+999));
answer = Math.max(answer, canInclud(starts,ends,ends[i],ends[i]+999));
}
return answer;
}
//겹치는 구간 확인
public int canInclud(int[] starts,int[] ends, int start, int end){
int count =0;
for(int i=0; i<starts.length; i++){
//범위
if(starts[i] > end || ends[i] < start) continue;
else count++;
}
return count;
}
//시분초 파싱
public int parsing(String time){
String[] str =time.split(":");
int hh = Integer.parseInt(str[0]) *60*60;
int mm = Integer.parseInt(str[1]) *60;
return (hh+mm) * 1000 + (int)(Double.parseDouble(str[2]) * 1000);
}
//더해지는 ms 값 파싱
public int dobleChange(String time){
String cut =time.split("s")[0];
String[] str =cut.split("\\.");
int len = str[1].length();
int num = Integer.parseInt(str[1]);
if(len==1) str[1] = num +"00";
else if (len==2) str[1] = num +"0";
else str[1] = str[1].substring(0,3);
return Integer.parseInt(str[0] + str[1]);
}
// [간단 버전] 반올림으로 안전하게
public int dobleChange2(String time){
String cut = time.substring(0, time.length()-1); // 's' 제거
double sec = Double.parseDouble(cut); // "2" or "0.351"
return (int)Math.round(sec * 1000.0); // ms
}
}
회고.
1. ms 숫자 변환 double 변환 후 Math.rount( 변수 * 1000.0) 으로 반올림 해줘야 . 제거 가능
2. 여러 구간별로 시작 값에서 1초 , 종료 값에 1초로 윈도우 슬라이딩으로 해당 1초 구간 내에 겹치는 다른 구간들 갯수 확인 후 max 값 갱신
-> 시작값 배열 , 종료 값 배열 2개 모두 순회 1초 구견별 포함된 값 개수 체크
* ms 파싱하는게 어려웠음.
** 구조 짤때 윈도우 슬라이딩인데 처음 접해보는 접근 방식이였음.