프로그래머스 - 추석 트래픽

J-Keonho·2020년 9월 9일
0

해당 알고리즘 자료는 제가 직접 푼 것도 있지만 다른 분들의 풀이과의 비교를 통해 더 나은 알고리즘을 공부하기 위해 정리한 것들입니다.

프로그래머스 - 추석 트래픽

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

풀이 : 트래픽의 시작시간과 끝시간을 구해 시간을 기준으로 1초동안의 트래픽의 수를 계산

import java.util.*;

class Solution {
    public int solution(String[] lines) {
        int answer = 0;
        int[] startTimes = new int[lines.length];
        int[] endTimes = new int[lines.length];

       getTimes(lines, startTimes, endTimes); // 시작시간, 끝 시간을 계산

        for(int i = 0 ; i < lines.length ; ++i) {
            int cnt = 0;
            int startOfSection = startTimes[i]; // 시작시간 기준
            int endOfSection = startOfSection + 1000;

            for(int j = 0 ; j < lines.length ; ++j) {
                if(startTimes[j] >= startOfSection && startTimes[j] < endOfSection) {
                    cnt++;
                } else if(endTimes[j] >= startOfSection && endTimes[j] < endOfSection) {
                    cnt++;
                } else if(startTimes[j] <= startOfSection && endTimes[j] >= endOfSection) {
                    cnt++;
                }
            }

            answer = cnt > answer ? cnt : answer;
        }

        for(int i = 0 ; i < lines.length ; ++i) {
            int cnt = 0;
            int startOfSection = endTimes[i]; // 끝시간 기준
            int endOfSection = startOfSection + 1000;

            for(int j = 0 ; j < lines.length ; ++j) {
                if(startTimes[j] >= startOfSection && startTimes[j] < endOfSection) {
                    cnt++;
                } else if(endTimes[j] >= startOfSection && endTimes[j] < endOfSection) {
                    cnt++;
                } else if(startTimes[j] <= startOfSection && endTimes[j] >= endOfSection) {
                    cnt++;
                }
            }

            answer = cnt > answer ? cnt : answer;
        }

        return answer;
    }

    private void getTimes(String[] lines, int[] startTimes, int[] endTimes) {
        for(int i = 0 ; i < lines.length ; ++i) {
            String[] log = lines[i].split(" ");
            String[] responseTime = log[1].split(":");
            int processingTime = (int)(Double.parseDouble(log[2].substring(0, log[2].length() - 1)) * 1000);
            int startTime = 0;	// 시작시간
            int endTime = 0; // 끝 시간

            endTime += Integer.parseInt(responseTime[0]) * 60 * 60 * 1000;
            endTime += Integer.parseInt(responseTime[1]) * 60 * 1000;
            endTime += (int)(Double.parseDouble(responseTime[2]) * 1000);
            startTime = endTime - processingTime + 1;

            startTimes[i] = startTime;
            endTimes[i] = endTime;
        }
    }
}
profile
안녕하세요.

0개의 댓글