[1차] 추석 트래픽(level3)

원용현·2022년 8월 19일
0

프로그래머스

목록 보기
4/49

링크

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

문제

각 트래픽이 끝난 시간과 처리까지 걸린 시간이 주어질 때 1초를 기준으로 가장 트래픽이 많이 몰린 수를 구하라.

예제로 이해


트래픽이 다음과 같이 주어질 때 우선 가장 먼저 해야 할 작업은 각각의 트래픽에 대해서 시작 시간과 끝나는 시간을 구해야 한다.

로그에 찍히는 시간은 끝나는 시간을 기준으로 나오기 때문에 뒤에 함께 찍힌 시간을 빼서 시작하는 시간을 계산해야한다. 이 때 시작 시간과 끝나는 시간도 트래픽을 처리하는 시간에 포함되므로 빼준 시간에서 0.001초를 더해서 정확히 처리에 걸린 시간을 계산해야한다.

각각의 트래픽에 대해서 시작 시간, 끝난 시간 계산이 끝나면 1초 동안 가장 많은 트래픽을 처리한 구간을 찾아야 한다.

구하는 방법은 여러가지가 있겠지만 여기서는 그 중 한 가지 방법을 소개한다.

트래픽이 가장 많이 몰리는 시간은 우리가 시작 시간과 끝난 시간만 가지고 볼 때, 쉽게 계산하기 어렵지만 한 가지 알 수 있는 점은 각 트래픽이 시작하는 시점에서 가장 많은 트래픽이 몰릴 것이라는 점이다.

따라서 트래픽이 시작하는 시간을 포함하는 이전 1초 동안 가장 많은 트래픽이 몰릴 것이다.

이것을 코드로 만들어 주면 해당 문제를 해결할 수 있다.

코드

function solution(lines) {
    const timeArr = []
    let result = 0
    
    lines.map(el => {
        let arr = el.split(' ')
        let time2 = new Date(arr[0] + ' ' + arr[1]).getTime()
        let time1 = time2 - parseFloat(arr[2]) * 1000 + (parseFloat(arr[2]) === 0.001 ? 0 : 1)
        timeArr.push([time1, time2])
    })
    
    timeArr.map((el1) => {
        let start = 0
        
        timeArr.forEach(el2 => {
            if(el1[0] - 999 <= el2[1] && el1[0] >= el2[0]) {
                start++
            }
            
            result = Math.max(result, start)
        })
    })
    
    return result
}

코드 풀이

lines.map(el => {
	let arr = el.split(' ')
	let time2 = new Date(arr[0] + ' ' + arr[1]).getTime()
	let time1 = time2 - parseFloat(arr[2]) * 1000 + (parseFloat(arr[2]) === 0.001 ? 0 : 1)
	timeArr.push([time1, time2])
})

위의 코드는 시작 시간과 끝나는 시간을 계산하는 반복문이다. 주어진 로그를 가지고 시작 시간과 끝나는 시간을 가지는 2차원 배열을 만들어낸다.

시간을 가지고 직접 계산하는 것도 가능하지만 좀 더 쉽게하기 위해서 getTime() 을 사용했다. 해당 메소드를 Date 객체에 사용하게 되면 시간을 밀리초로 바꾸어준다.

로그에 찍히는 시간이 초, 밀리초 단위로 계산이 많이 이루어지기 때문에 시간 전체를 밀리초 단위로 변환하면 좀 더 계산이 쉬워진다.

timeArr.map((el1) => {
	let start = 0
        
	timeArr.forEach(el2 => {
		if(el1[0] - 999 <= el2[1] && el1[0] >= el2[0]) {
			start++
		}
            
		result = Math.max(result, start)
	})
})

만들어진 시작 시간, 끝난 시간을 가지는 2차원 배열로 다시 한 번 반복문을 실행한다. 이 안에는 1초 동안 몇 개의 트래픽이 발생했는지를 계산하는 반복문을 다시 실행하고 구한 값으로 최대값 비교를 통해 최대 트래픽 발생 횟수를 저장한다.

timeArr.forEach(el2 => {
	if(el1[0] - 999 <= el2[1] && el1[0] >= el2[0]) {
		start++
	}
	result = Math.max(result, start)
})

반복문 안에서 다시 실행하는 반복문이다.

이 반복문은 el1[0] 즉 트래픽의 시작 시간을 가지고 모든 트래픽의 시간들과 비교를 진행한다.

각 트래픽의 시작 및 끝난 시간을 현재 트래픽의 시작 시간에서 1초 이전의 시간까지 비교했을 때 그 시간 안에 트래픽이 진행 중이라면 값을 증가시킨다.

증가 시킨 값을 최대값 비교를 통해서 반환해줄 최대 트래픽 수에 저장하는 과정까지 추가해준다.

모든 반복문이 끝나면 우리가 원하는 최대 트래픽 수가 나오므로 해당 값을 리턴해준다.

0개의 댓글