2018 KAKAO BLIND RECRUITMENT [추석트래픽] 본문

알고리즘_프로그래머스/KAKAO

2018 KAKAO BLIND RECRUITMENT [추석트래픽]

giron 2021. 7. 21. 10:28
728x90

https://programmers.co.kr/learn/courses/30/lessons/17676

 

코딩테스트 연습 - [1차] 추석 트래픽

입력: [ "2016-09-15 20:59:57.421 0.351s", "2016-09-15 20:59:58.233 1.181s", "2016-09-15 20:59:58.299 0.8s", "2016-09-15 20:59:58.688 1.041s", "2016-09-15 20:59:59.591 1.412s", "2016-09-15 21:00:00.464 1.466s", "2016-09-15 21:00:00.741 1.581s", "2016-09-1

programmers.co.kr

생각보다 단순해서 level3인줄 몰랐다. 하지만 문자열을 나누고 파싱하고 비교하는 등 번거롭고 시간잡아먹는게 많아서 실전이었으면 멘탈 좀 흔들렸을것 같다.

 

말을 들으면 잘 이해가 안갔다. 하지만 문제에 친절히 그림까지 있어서 그림을 보고 이해했다.

해결 방법은 타임라인의 시작부분과, 끝부분을 기준으로 해서 1초사이에 몇개의 다른 로그들이 더 있는지 카운트해주면 된다. 아래는 소스코드이다.

import java.util.*;
class Solution {
    public int solution(String[] lines) {
        int answer = 0;
        List<Double> start = new ArrayList<>();
        List<Double> end = new ArrayList<>();
        List<Integer> total = new ArrayList<>();
        
        for(int i=0; i<lines.length; ++i){
            String[] log = lines[i].split(" ");
            String endDate = log[1];
            String times = log[2];
            int target = times.indexOf("s");
            Double time = Double.parseDouble(times.substring(0,target));//걸린 시간
            
            String[] nano = endDate.split(":");
            Double sec = Double.parseDouble(nano[0])*3600;
            sec+=Double.parseDouble(nano[1])*60;
            sec+=Double.parseDouble(nano[2]);//초단위로 변환
            
            Double startDate = sec-(time)+0.001;
            start.add(startDate);
            //endDate 초단위 변환->sec
            end.add(sec);
        }
        if(lines.length == 1){
           return 1;
       }
        for(int i=0; i<start.size(); ++i){
            int cnt=1;
            
            Double st = start.get(i);
            Double ed = end.get(i);
            
            for(int j=i+1; j<start.size(); ++j){
                if (Math.abs(ed-start.get(j)) < 1 || Math.abs(ed-end.get(j)) < 1
                    || Math.abs(st-start.get(j)) < 1 || Math.abs(st-end.get(j)) < 1
                    || (st <= start.get(j) && end.get(j) <= ed)
                    || (start.get(j) <= st && ed <= end.get(j))
                   ) {
                    cnt++;
                }
            }
            answer = Math.max(answer,cnt);
        }
        
        return answer;
    }
}
728x90
Comments