상세 컨텐츠

본문 제목

[1차] 추석 트래픽 (2018 KAKAO BLIND RECRUITMENT)

프로그래머스 코딩테스트 풀이

by 발발개발 2022. 8. 2. 17:00

본문

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

풀이

import java.text.*;
import java.util.*;

class Solution {
    public int solution(String[] lines) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss.SSS");
        List<Date> startDateList = new ArrayList<>();
        List<Date> endDateList = new ArrayList<>();

        for (String line : lines) {
            StringTokenizer st = new StringTokenizer(line, " ");
            st.nextToken();
            Date endDate;
            try {
                endDate = simpleDateFormat.parse(st.nextToken());
            } catch (ParseException e) {
                throw new RuntimeException(e);
            }
            String consumeSecStr = st.nextToken();
            int consumeMilliSec = -1 * (int)(Double.parseDouble(consumeSecStr.substring(0, consumeSecStr.length() - 1)) * 1000) + 1;
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(endDate);
            calendar.add(Calendar.MILLISECOND, consumeMilliSec);
            Date startDate = calendar.getTime();

            startDateList.add(startDate);
            endDateList.add(endDate);
        }

        int resultCnt = 0;

        for (Date rangeStartDate : startDateList) {
            long rangeStartTime = rangeStartDate.getTime();
            long rangeEndTime = rangeStartTime + 999;
            int cnt = getCnt(lines, startDateList, endDateList, rangeStartTime, rangeEndTime);

            resultCnt = Math.max(resultCnt, cnt);

            rangeEndTime = rangeStartDate.getTime();
            rangeStartTime = rangeEndTime - 999;
            cnt = getCnt(lines, startDateList, endDateList, rangeStartTime, rangeEndTime);

            resultCnt = Math.max(resultCnt, cnt);
        }

        for (Date rangeEndDate : endDateList) {
            long rangeEndTime = rangeEndDate.getTime();
            long rangeStartTime = rangeEndTime - 999;
            int cnt = getCnt(lines, startDateList, endDateList, rangeStartTime, rangeEndTime);

            resultCnt = Math.max(resultCnt, cnt);

            rangeStartTime = rangeEndDate.getTime();
            rangeEndTime = rangeStartTime + 999;
            cnt = getCnt(lines, startDateList, endDateList, rangeStartTime, rangeEndTime);

            resultCnt = Math.max(resultCnt, cnt);
        }

        return resultCnt;
    }

    private int getCnt(String[] lines, List<Date> startDateList, List<Date> endDateList, long rangeStartTime, long rangeEndTime) {
        int cnt = lines.length;

        for (int i = 0; i < lines.length; i++) {
            long startTime = startDateList.get(i).getTime();
            long endTime = endDateList.get(i).getTime();

            if (endTime < rangeStartTime || startTime > rangeEndTime) {
                cnt--;
            }
        }
        return cnt;
    }
}

관련글 더보기

댓글 영역