Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript로 시간 배열에서 최소 시차 구하기

문제 개요

"시:분" 형식으로 표현된 24시간제 시간 문자열 배열을 입력받아, 배열 내 임의의 두 시점 사이의 시간 차이 중 가장 작은 값을 분 단위로 구하는 JavaScript 함수를 작성해야 합니다.

예를 들어 함수에 다음과 같은 배열이 입력된다고 가정해 보겠습니다.

const arr = ["23:59","00:00"];

이때 함수는 아래와 같은 결과를 반환해야 합니다.

const output = 1;

"23:59"와 다음 날 "00:00" 사이의 시간 차이가 정확히 1분이기 때문입니다. 즉, 자정을 넘어가는 시간 차이도 올바르게 계산해야 한다는 점이 이 문제의 핵심입니다.

구현 예제

다음은 이 문제를 해결하는 전체 코드입니다.

const arr = ["23:59","00:00"];
const findMinDifference = (arr = []) => {
    const find = (str = '') => str.split(':').map(time => parseInt(time, 10))
    const mapped = arr.map((time) => {
        const [hour1, minute1] = find(time)
        return hour1 * 60 + minute1
    });
    const sorted = []
    let isrepeating = false
    mapped.forEach((time) => {
        if (sorted[time] !== undefined || sorted[time + 24 * 60] !== undefined) {
            isrepeating = true
        }
        sorted[time] = time
        sorted[time + 24 * 60] = time + 24 * 60
    })
    if (isrepeating) {
        return 0
    }
    let min = Infinity
    let prev = null
    for (let i = 0; i < sorted.length; i++) {
        if (sorted[i] !== undefined) {
            if (prev !== null) {
                min = Math.min(min, sorted[i] - prev)
            }
            prev = sorted[i]
        }
    }
    return min
};
console.log(findMinDifference(arr));

코드 설명

이 알고리즘은 다음과 같은 단계로 동작합니다.

  • 분 단위 변환: 각 시간 문자열을 콜론(:)을 기준으로 분리한 뒤, '시 × 60 + 분' 공식을 적용해 하루 기준 총 분 수로 변환합니다.
  • 순환 구조 처리: 시간은 본질적으로 원형 구조이므로, 각 시각을 원래 위치와 24시간(1440분) 뒤 위치에 동시에 저장합니다. 덕분에 "23:59" → "00:00"처럼 자정을 넘나드는 차이도 별도의 예외 처리 없이 선형 탐색만으로 계산할 수 있습니다.
  • 중복 검사: 동일한 시각이 두 번 이상 나타나면 최소 차이는 곧바로 0이 되므로, 반복 플래그를 확인해 즉시 0을 반환합니다.
  • 최소 차이 계산: 인덱스 순서대로 배열을 순회하면서 이전 값과 현재 값의 차이를 비교하고, 그중 가장 작은 값을 갱신해 나갑니다.

참고로 이 방식은 시간 문자열을 모두 정렬하는 대신 인덱스를 버킷처럼 활용하기 때문에, 입력 크기와 무관하게 하루(1440분) 범위 내에서 효율적으로 동작합니다.

실행 결과

위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.

1