[프로그래머스] 17676 추석 트래픽

ack·2021년 1월 21일
0

Algorithm Study

목록 보기
7/21
post-thumbnail

📌 문제

이번 추석에도 시스템 장애가 없는 명절을 보내고 싶은 어피치는 서버를 증설해야 할지 고민이다. 장애 대비용 서버 증설 여부를 결정하기 위해 작년 추석 기간인 9월 15일 로그 데이터를 분석한 후 초당 최대 처리량을 계산해보기로 했다. 초당 최대 처리량은 요청의 응답 완료 여부에 관계없이 임의 시간부터 1초(=1,000밀리초)간 처리하는 요청의 최대 개수를 의미한다.

✔ 접근방법

입력되는 시간의 경우 모두 초 단위로 환산한다.
환산한 응답시간 - 처리시간 + 1 (끝시간을 포함하기 때문에 1을 더함)을 통해 시작시간을 계산한다.

계산된 시작시간과 응답시간을 기준으로 윈도우를 생성하여 최대값을 계산한다.

✔ 코드

import java.util.*;
class Solution {
public int solution(String[] lines) {
		int answer = 0;
		Arrays.sort(lines);
		ArrayList<int[]> al = new ArrayList<>();

		for (int i = 0; i < lines.length; i++) {
			String line = lines[i];
			String[] times = line.split(" ");
			String[] s = times[1].split(":");

			int t = (int) (Double.parseDouble(times[2].substring(0, times[2].length() - 1)) * 1000); // 처리시간 t

			// 응답 완료시간
			int endTime = 0;

			endTime += Integer.parseInt(s[0]) * 3600 * 1000;
			endTime += Integer.parseInt(s[1]) * 60 * 1000;
			endTime += (int) (Double.parseDouble(s[2]) * 1000);

			int startTime = endTime - t + 1;
			int[] temp = new int[2];
			temp[0] = startTime;
			temp[1] = endTime;
			al.add(temp);
		}

		//각 로그의 시작과 끝을 기준으로 윈도우를 설정하고 최대값을 구한다.
		for (int i = 0; i < al.size(); i++) {
			int startMax = 0;
			int endMax = 0;
			int start = al.get(i)[0];
			int end = al.get(i)[1];
			for (int j = 0; j < al.size(); j++) {
				int targets = al.get(j)[0];
				int targete = al.get(j)[1];
				if (start <= targete && start + 999 >= targets)
					startMax++;
				if (end <= targete && end + 999 >= targets)
					endMax++;
			}

			answer = Math.max(answer, startMax);
			answer = Math.max(answer, endMax);
		}

		return answer;
}
}

🖋 회고

혼자서 최대한 풀어볼려고 시간을 많이 끌었다. 처음에 시간을 초 단위로 환산하는 생각을 못해서.. 삽집을 오래했다 풀고나면 어렵지 않게 느껴지는데 문제를 풀 때는 진짜 어떻게 해야하나 고민도 많이하고 시행착오도 많이 겪었다.
너무 기초지만, 자료형으로 변환하는 과정에서 값이 날라갈 수도 있으니까, 그 부분도 꼭 체크할 것...

풀 땐 힘들었지만 성장의 과정이라고 생각한다.

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

profile
아자 (*•̀ᴗ•́*)و

0개의 댓글