카테고리 없음

(코테) 프로그래머스_[1차] 추석 트래픽 *윈도우 슬라이딩

불광동 물주먹 2025. 8. 29. 14:08

 

 

 

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 파싱하는게 어려웠음.  

** 구조 짤때  윈도우 슬라이딩인데 처음 접해보는 접근 방식이였음.