알고리즘 공부/프로그래머스

(Java)프로그래머스 코딩테스트 연습 - 2018 KAKAO BLIND RECRUITMENT - [1차] 추석 트래픽

HRuler 2020. 12. 14. 19:59

1. 문제

https://programmers.co.kr/learn/courses/30/lessons/17676?language=java

 

코딩테스트 연습 - [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-15 21:00:00.748

programmers.co.kr

2. 나의 풀이

import java.util.*;

class Solution {
    
    private class log{
        String date;
    	float start;
    	float end;
    	
    	public log(String date, float start, float end) {
            this.date = date;
        	this.start = start;
    	    this.end = end;
    	}
    }
    
    public int solution(String[] lines) {
        int answer = 0;
        
        ArrayList<log> arr = new ArrayList<>();
        
        for(String str : lines) {
        	//처리 시간을 숫자 형태로 바꾸기 위한 처리
        	str = str.replace("s", "");
        	//공백을 기준으로 문자열을 나누는 처리
        	String [] str_arr = str.split(" ");
        	//배열의 첫 번째 인덱스를 date에 저장
        	String date = str_arr[0];
        	//끝난 시간을 :를 기준으로 나누는 처리
        	String [] time_arr = str_arr[1].split(":");
        	//종료 시간을 실수 형태로 변환
        	float end = (Float.parseFloat(time_arr[0]) * 3600) + (Float.parseFloat(time_arr[1]) * 60) + (Float.parseFloat(time_arr[2]));
        	//종룔 시간에 처리 시간을 빼내어 시작 시간을 구하는 처리
        	float start = end - Float.parseFloat(str_arr[2]) + (float)0.001;
        	//System.out.println("date : " + date + ", start : " + start + ", end : " + end);
        	//리스트에 넣는 처리
        	arr.add(new log(date, start, end));
        }
        
        //끝난 시간 -> 시작 시간 우선 순위 순으로 정렬
        Collections.sort(arr, new Comparator<log>() {

			@Override
			public int compare(log o1, log o2) {
				if(o1.end == o2.end) {
					if(o1.start < o2.start) {
						return -1;
					}else {
						return 1;
					}
				}else if(o1.end < o2.end) {
					return -1;
				}else {
					return 1;
				}
			}
        	
        });
        
        for(int i = 0, outter = arr.size(); i < outter; i = i + 1) {
        	log gijun = arr.get(i);
        	//종료 시간 기준으로 1초 뒤의 시간을 구하는 처리
        	float range = gijun.end + (float)0.999;
        	int cnt = 0;
        	for(int j = i, inner = arr.size(); j < inner; j = j + 1) {
        		log next = arr.get(j);
        		//비교하려는 시작 시간이 기준보다 작을 경우
        		if(range >= next.start) {
        			cnt++;
        		}
        	}
        	if(answer < cnt) {
        		answer = cnt;
        	}
        }
        
        return answer;
    }
}

3. 다른 사람 풀이

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;

public class Solution {

public int solution(String[] lines) {
        int answer = 0;
        List<Long> checkPointList = new ArrayList<Long>();
        List<Log> logList = new ArrayList<Log>();

        for (String line : lines) {
            Log log = new Log(line);
            checkPointList.add(log.getStart());
            checkPointList.add(log.getEnd());
            logList.add(log);
        }

        Collections.sort(checkPointList);

        int top = 0;
        for(int i = 0; i < checkPointList.size(); i++) {
            int count = 0;
            for (Log log : logList) {
                if(log.isIn(checkPointList.get(i), checkPointList.get(i) + 999)) {
                    count++;
                }
            }

            if(count > top) {
                top = count;
            }
        }

        answer = top;
        return answer;
    }

    class Log {
        private long start = 0;
        private long duration = 0;
        private long end = 0;

        public Log(String line) {
            String[] split = line.split(" ");
            String dateString = split[0] + " " + split[1];
            try {
                Date startDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").parse(dateString);
                this.end = startDate.getTime();

                String[] split2 = split[2].split("s");
                double parseDouble = Double.parseDouble(split2[0]);
                this.duration = (long) (parseDouble * 1000);

                this.start = this.end - this.duration; 

            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        public boolean isIn(long checkPointStart, long checkPointEnd) {
            if(this.end < checkPointStart || this.start >= checkPointEnd) {
                return false;
            } else
                return true;
        }

        public long getStart() {
            return start;
        }

        public void setStart(long start) {
            this.start = start;
        }

        public long getDuration() {
            return duration;
        }

        public void setDuration(long duration) {
            this.duration = duration;
        }

        public long getEnd() {
            return end;
        }

        public void setEnd(long end) {
            this.end = end;
        }
    }
}