
난이도: ★★☆☆☆ • solved on: 2025-12-11

a1 b1 a2 b2 ... 형식으로 오름차순 정렬된 상태로 출력해야 한다.자료구조
List<Integer>: 입력/출력 관리ArrayList<Integer>: 결과 쌍 저장알고리즘/기법
sort) 후 인접 원소 차이만 검사핵심 키워드
배열을 오름차순 정렬한다.
정렬된 상태에서는
“최소 차이를 가지는 두 원소는 항상 인접한 두 원소 중에 있다.”
따라서arr[i]와arr[i+1]의 차이만 보면 된다.
첫 번째 인접 쌍으로 minDistance 를 초기화한 뒤,
정렬(arr)
minDistance = arr[1] - arr[0]
result = [arr[0], arr[1]]
for i from 1 to n-2:
currentDistance = arr[i+1] - arr[i]
if currentDistance < minDistance:
result.clear()
result.add(arr[i])
result.add(arr[i+1])
minDistance = currentDistance
else if currentDistance == minDistance:
result.add(arr[i])
result.add(arr[i+1])
return result
arr[i+1] - arr[i] 는 항상 0 이상이어서 Math.abs 없이 그대로 사용 가능하다.public static List<Integer> closestNumbers(List<Integer> arr) {
List<Integer> result = new ArrayList<>();
arr.sort((a, b)->{
return a.compareTo(b);
});
int minDistance = 0;
for(int i = 0; i < arr.size(); i++){
if(i == arr.size()-1) break;
if(i == 0){
minDistance = arr.get(i+1) - arr.get(i);
result.add(arr.get(i));
result.add(arr.get(i+1));
continue;
}
int currentDistance = arr.get(i+1) - arr.get(i);
if(currentDistance < minDistance){
result.clear();
result.add(arr.get(i));
result.add(arr.get(i+1));
minDistance = currentDistance;
continue;
}
if(currentDistance == minDistance){
result.add(arr.get(i));
result.add(arr.get(i+1));
}
}
return result;
}
시간 복잡도:
공간 복잡도:
result 만 사용 → O(K) (K는 답으로 나오는 원소 개수)minDistance 를 적절히 설정해 놓고 반복문에서 값을 갱신하지 않아서 문제가 발생했다.minDistance 를 언제, 어떤 값으로 초기화할지에 대한 감이 부족하면최소값/최댓값 관리 패턴
보통은
int min = Integer.MAX_VALUE;
for (...) {
min = Math.min(min, value);
}
같이 “절대 이길 수 없는 값”으로 초기화한 뒤, 반복문에서만 갱신하는 패턴이 깔끔하다.
정렬 후 인접 원소만 보는 패턴은
비슷한 유형 (GPT 추천)
확장 문제 (GPT 추천)