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

문제 유형: 정렬(Sorting), 문자열 처리
요구사항
long 범위를 넘어설 수 있어, 숫자형으로 변환해서 비교할 수 없다.자료구조
List<String> : 입력 숫자들을 문자열로 저장PriorityQueue<T> : 최소 힙(min-heap) 구현Map<Integer, PriorityQueue<String>> : 길이 그룹별 힙 저장알고리즘/기법
핵심 키워드
CustomString + PriorityQueue 단일 힙 시도 (첫 시도)전략
CustomString이라는 래퍼 클래스를 만들고,Comparable<CustomString>을 구현한다.compareTo에서 ...
- 먼저 문자열 길이를 비교하고
- 길이가 같으면 문자열 사전순으로 비교한다.
- 이렇게 하면
PriorityQueue<CustomString>하나만 써도,
- 항상 “가장 작은 수”가 힙의 top 에 오도록 만들 수 있다.
1) CustomString에 Comparable 구현
- 길이 짧은 문자열이 더 작다.
- 길이가 같으면 사전순으로 비교한다.
2) 모든 입력 문자열을 CustomString으로 감싸서 Min-Heap에 넣는다.
3) 힙에서 poll() 하면서 하나씩 꺼내 result 리스트에 data만 저장한다.
public static class CustomString implements Comparable<CustomString>{
String data;
public CustomString(String data){
this.data = data;
}
@Override
public int compareTo(CustomString comparedString){
if(this.data.length() < comparedString.data.length()){
return -1;
} else if(this.data.length() > comparedString.data.length()){
return 1;
} else {
return this.data.compareTo(comparedString.data);
}
}
}
public static List<String> bigSorting(List<String> unsorted) {
// Write your code here
List<String> result = new ArrayList<>();
PriorityQueue<CustomString> heap = new PriorityQueue<>();
for(int i = 0; i < unsorted.size()-1; i++){
heap.add(new CustomString(unsorted.get(i)));
}
for(int i = 0; i < unsorted.size(); i++){
result.add(heap.poll().data);
}
return result;
}
O(N log N × L) 로, 나중에 나올 정렬 풀이와 같은 오더이다.의도
숫자 문자열의 길이를 key 로 하는
Map<Integer, PriorityQueue<String>>를 만든다.각 길이마다 문자열들을
PriorityQueue에 넣으면,
- 해당 길이 그룹 내부는 자동으로 사전순 정렬이 된다.
길이들(key)도
PriorityQueue<Integer>에 넣어
- 길이가 작은 그룹부터 차례대로 꺼내면서
- 각 그룹의 PQ를 전체적으로 앞에서부터 빼서 결과 리스트에 쌓는다.
결국
- "길이 오름차순" → "길이가 같은 구간 내부는 사전순" 이라는
- 이 문제의 정렬 기준을 자료구조 레벨에서 그대로 흉내 낸 풀이이다.
1) for 각 문자열 item:
len = item.length()
mapQueue[len] 이 없으면 새 PriorityQueue 생성
mapQueue[len].add(item) // 같은 길이끼리 사전순으로 정렬되는 힙
2) for 각 길이 key in mapQueue.keySet():
keyQueue.add(key) // 길이들을 오름차순으로 관리
3) while keyQueue not empty:
key = keyQueue.poll() // 가장 짧은 길이부터
while mapQueue[key] not empty:
result.add(mapQueue[key].poll()) // 사전순대로 꺼냄
public static List<String> bigSorting(List<String> unsorted) {
// Write your code here
List<String> result = new ArrayList<>();
Map<Integer, PriorityQueue<String>> mapQueue = new HashMap<>();
PriorityQueue<Integer> keyQueue = new PriorityQueue<>();
for(String item: unsorted){
if(!mapQueue.containsKey(Integer.valueOf(item.length()))){
mapQueue.put(Integer.valueOf(item.length()), new PriorityQueue<>());
}
mapQueue.get(Integer.valueOf(item.length())).add(item);
}
for(Integer key : mapQueue.keySet()){
keyQueue.add(key);
}
while(!keyQueue.isEmpty()){
Integer key = keyQueue.poll();
while(!mapQueue.get(key).isEmpty()){
result.add(mapQueue.get(key).poll());
}
}
return result;
}
정렬 전략 자체는 완전히 맞다.
길이 → 사전순 이라는 규칙을
다만
O(N log N × L) 수준이다.log 요인이 붙고, 문자열 비교 비용이 곱해진다.)이 문제에서 요구하는 건
핵심 전략
이 문제의 본질은
- “정수로 바꿀 수 없는 큰 수를, 정수 크기 순서로 정렬하는 방법” 이다.
큰 수 비교 규칙은 다음 두 단계로 요약할 수 있다.
문자열 길이가 다르면
- 길이가 더 짧은 수가 더 작은 수이다.
길이가 같으면
- 문자열을 사전순(lexicographical) 으로 비교하면
→ 실제 정수 크기 비교와 동일해진다.
이 규칙을 람다 함수를 활용해
Comparator<String>으로 한 번만 정의해서
unsorted.sort(comparator)로 정렬하면- 별도의 Map, PQ 없이 문제를 해결할 수 있다.
unsorted.sort( (a, b) -> {
if (a.length() != b.length())
return a.length() - b.length(); // 자리수가 적은 수가 더 작다.
return a.compareTo(b); // 길이가 같을 때 사전순
});
return unsorted;
import java.util.*;
public class Solution {
public static List<String> bigSorting(List<String> unsorted) {
// "정수값" 기준을 문자열 길이 + 사전순으로 표현하는 Comparator
unsorted.sort((a, b) -> {
int lenA = a.length();
int lenB = b.length();
if (lenA != lenB) {
return lenA - lenB; // 길이가 짧은 수가 더 작다
}
return a.compareTo(b); // 길이가 같으면 사전순 비교
});
return unsorted;
}
}
방법 1 : CustomString + PriorityQueue 단일 힙
시간 복잡도
add) 다시 빼는(poll) 과정 → O(N log N)O(L)O(N log N × L)공간 복잡도
O(N)방법 2 : Map + PriorityQueue(여러 개) + keyQueue
시간 복잡도
O(N log N) 수준O(N log N)O(N log N × L)공간 복잡도
O(N)방법 3 : List + Comparator 정렬
시간 복잡도
O(N log N)O(N log N × L)공간 복잡도
O(N) 이하처음에는
두 번째 풀이에서는
결국 이 문제는 어떤 자료구조를 쓰느냐보다, “정렬 기준을 어떻게 설계하느냐”가 핵심임을 깨닫게 된다.
큰 수 정렬 문제에서 기본 전략은 다음과 같이 기억해두면 좋다.
길이 비교: 자리수가 적은 수가 항상 더 작다.
길이가 같으면 문자열 사전순: 정수 비교와 동일한 결과를 보장한다.
Java에서 정렬 문제에 부딪혔을 때:
“자료구조로 해결해야 할까?” 를 고민하기 전에
Comparator 하나로 해결 가능한지 먼저 생각하는 습관을 들이는 것이 좋다.
Comparable vs Comparator
Comparable: 클래스 자체에 “기본 정렬 기준”을 넣고 싶을 때
Comparator:
PriorityQueue는
비슷한 유형 (GPT 추천)
확장 문제 (GPT 추천)