알고리즘

프로그래머스 [1차] 추석 트래픽 (오답)

ziwookim 2022. 8. 4. 20:31

문제 설명

추석 트래픽

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

입력 형식

  • solution 함수에 전달되는 lines 배열은 N(1 ≦ N ≦ 2,000)개의 로그 문자열로 되어 있으며, 각 로그 문자열마다 요청에 대한 응답완료시간 S와 처리시간 T가 공백으로 구분되어 있다.
  • 응답완료시간 S는 작년 추석인 2016년 9월 15일만 포함하여 고정 길이 2016-09-15 hh:mm:ss.sss 형식으로 되어 있다.
  • 처리시간 T 0.1s, 0.312s, 2s 와 같이 최대 소수점 셋째 자리까지 기록하며 뒤에는 초 단위를 의미하는 s로 끝난다.
  • 예를 들어, 로그 문자열 2016-09-15 03:10:33.020 0.011s은 "2016년 9월 15일 오전 3시 10분 33.010초"부터 "2016년 9월 15일 오전 3시 10분 33.020초"까지 "0.011초" 동안 처리된 요청을 의미한다. (처리시간은 시작시간과 끝시간을 포함)
  • 서버에는 타임아웃이 3초로 적용되어 있기 때문에 처리시간은 0.001 ≦ T ≦ 3.000이다.
  • lines 배열은 응답완료시간 S를 기준으로 오름차순 정렬되어 있다.

출력 형식

  • solution 함수에서는 로그 데이터 lines 배열에 대해 초당 최대 처리량을 리턴한다.

코드 - (오답)

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

class Solution {
	public int solution(String[] lines) throws ParseException {
        int answer = 0;

        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        // 'startTime' 'endTime' 데이터로 이루어진 리스트 period
        Date[][] period = new Date[lines.length][2];

        for(int i=0; i< lines.length; i++) {

            String[] log = lines[i].split(" ");
            String dateInfo = log[0] + " " + log[1];
            Date endTime = df.parse(dateInfo);

			// duration은 startTime과 endTime을 포함하고 있는 것으로, -1 처리가 된 값을 duration으로 갖게 한다.
            int duration = (int) (Double.parseDouble(log[2].replaceAll("s", ""))* 1000) - 1;
            // 3000초보다 큰 경우, 타임아웃 처리
            if(duration > 2999) duration = 2999;

            Calendar cal = Calendar.getInstance();
            cal.setTime(endTime);
            // 주어진 데이터는 'endTime' 이므로 duration을 - 연산하여, 'startTime'을 구한다.
            cal.add(Calendar.MILLISECOND, -duration);

            Date startTime = cal.getTime();
            period[i][0] = startTime;
            period[i][1] = endTime;
        }

        for(int i=0; i<period.length; i++) {
            int cnt = 0;
			
            // 비교대상 i
            for(int j=0; j<period.length; j++) {
            // 정상 연산 되지 않음.
                if(period[i][0].compareTo(period[j][1]) <= 0 || period[j][0].compareTo(period[i][1]) <= 0) {
                    ++cnt;
                }

            }
            // MAX 값으로 answer 갱신
            if(answer < cnt) answer = cnt;
        }

        return answer;
    }
}

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

 

프로그래머스

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

programmers.co.kr

 

'알고리즘' 카테고리의 다른 글

프로그래머스 오픈채팅방  (0) 2022.08.19
프로그래머스 폰켓몬  (0) 2022.08.14
프로그래머스 정수 삼각형  (0) 2022.08.04
프로그래머스 기능개발  (0) 2022.07.27
프로그래머스 신규 아이디 추천  (0) 2022.07.27