문제 개요
"시:분" 형식으로 표현된 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