[자바][프로그래머스] 추석 트래픽 간단 풀이

프로그래밍/알고리즘2021. 1. 9. 00:44

코딩테스트 연습 - [1차] 추석 트래픽 | 프로그래머스 (programmers.co.kr)

위의 문제에 대한 코드입니다.

 

풀고나서 생각해보니 이 문제는 String으로 주어진 데이터를 파싱하기가.. 좀 귀찮아서 그렇지

핵심 원리만 알면 생각보다 단순한 문제였습니다.

 

이산 데이터가 아닌.. 연속된 데이터를 처리해야하는 문제 같아서 머리가 아팠습니다.

그런데 잘 생각해보면.. 시작시간과 종료시간만 이용하면 되고.. 그 중간 시간은 사용할 필요가 없었습니다.

 

파싱을 할 때 Date와 SimpleDateFormat을 쓸 수도 있는데 레거시 클래스라

일부러 ZoneDateTime을 써봤습니다.

 

코드가 그렇게 깔끔하진 않지만 참고차 올려봅니다.

import java.util.*;
import java.time.*;
import java.time.format.DateTimeFormatter;
import javafx.util.*;

class Solution {
    
    public int solution(String[] lines) {
        int answer = 1;
        List<Long> s_list = new ArrayList<>();
        List<Long> e_list = new ArrayList<>();
        
        for (String s : lines) {
            int n = s.length();
            int index = s.lastIndexOf(" ");
            String responseTime = s.substring(0, index);
            String duration = s.substring(index+1, n-1);
            
            Pair<Long, Long> p = getIncludedTime(responseTime, duration);
            
            s_list.add(p.getKey());
            e_list.add(p.getValue());
        }
        
        int n = s_list.size();
        for (int i=0; i<n-1; i++) {
            long end_time = e_list.get(i);
            long start_time = s_list.get(i);
            int cnt = 1;
            for (int j=i+1; j<n; j++) {
                long s = s_list.get(j);
                long e = e_list.get(j);
                
                //System.out.println("end_time = " + end_time +", s = " + s + ", e = " + e);
                
                if (Math.abs(end_time-s) < 1000 || Math.abs(end_time-e) < 1000
                    || Math.abs(start_time-s) < 1000 || Math.abs(start_time-e) < 1000
                    || start_time <= s && e <= end_time
                    || s <= start_time && end_time <= e
                   ) {
                    cnt++;
                }
            }
            answer = Math.max(answer, cnt);
        }
           
        return answer;
    }
    
    public Pair<Long, Long> getIncludedTime(String responseTime, String duration) {
        float d = Float.parseFloat(duration);
       
        ZonedDateTime zdt = LocalDateTime.parse(responseTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS" , Locale.US ))
            .atZone(ZoneId.of( "Asia/Seoul" ));
        //System.out.println(zdt);
        
        ZonedDateTime zdt_end = zdt;
        long long_end = zdt_end.toInstant().toEpochMilli();
        long long_start = (long_end-(long)(d*1000-1));
        /*
        System.out.println("  " + long_start);
        System.out.println("  " + long_end);
        System.out.println("  " + (long)(d*1000-1));
        */
        return new Pair<>(long_start, long_end);
    }
}

O(nlogn) 코드는 아래의 포스팅을 참고해주세요(c++)

softworking.tistory.com/379

 

[프로그래머스]2018 KAKAO BLIND RECRUITMENT[1차] : 추석 트래픽 (level 3)(c++)

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, 201..

softworking.tistory.com

 

작성자

Posted by 드리머즈

관련 글

댓글 영역