[프로그래머스 / Level3] [1차] 추석 트래픽 (Java)

wannabeking·2022년 6월 8일
0

코딩테스트

목록 보기
12/155

문제 보기



풀이

  • 작업의 시작 시간, 종료 시간을 저장하기 위해 Work 클래스 사용
  • Work를 저장하기 위해 ArrayList works 사용
  • 어떠한 시각 기준으로 1초 동안 한 작업이 수행 중인지 여부를 계산하는 check() 메소드 사용

  • lines를 순회하며 작업의 시작 시간과 종료 시간을 구하여 works 에 저장
  • works를 순회하며 work의 시작 시간, 종료 시간을 각각 기준으로 하여 1초 동안 수행 중인 작업들의 수를 check() 사용하여 계산
  • 계산한 것중 가장 큰 값 반환
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

class Solution {

    public int solution(String[] lines) {
        List<Work> works = new ArrayList<>();

        for (String line : lines) {
            String[] splitLine = line.split(" ");
            double[] endTimeArr = Arrays.stream(splitLine[1].split(":"))
                .mapToDouble(Double::parseDouble)
                .toArray();
            int endTime = 0;
            for (int i = 0; i < 3; i++) {
                endTime += (int) (endTimeArr[i] * Math.pow(60, 2 - i) * 1000);
            }
            int workTime = (int) (
                Double.parseDouble(splitLine[2].substring(0, splitLine[2].length() - 1)) * 1000);
            int startTime = endTime - workTime + 1;
            works.add(new Work(startTime, endTime));
        }

        int max = 0;
        for (Work work : works) {
            int num1 = 0;
            int num2 = 0;
            for (Work compWork : works) {
                if (check(work.getStartTime(), compWork)) {
                    num1++;
                }
                if (check(work.getEndTime(), compWork)) {
                    num2++;
                }
            }
            if (Math.max(num1, num2) > max) {
                max = Math.max(num1, num2);
            }
        }

        return max;
    }

    public boolean check(int time, Work work) {
        int startTime = work.getStartTime();
        int endTime = work.getEndTime();
        if (startTime >= time && startTime <= time + 999) {
            return true;
        } else if (endTime >= time && endTime <= time + 999) {
            return true;
        } else if (startTime < time && endTime > time + 999) {
            return true;
        }

        return false;
    }
}

class Work {

    private final int startTime;
    private final int endTime;

    public Work(int startTime, int endTime) {
        this.startTime = startTime;
        this.endTime = endTime;
    }

    public int getStartTime() {
        return startTime;
    }

    public int getEndTime() {
        return endTime;
    }
}
profile
내일은 개발왕 😎

0개의 댓글