프로그래밍/소프트웨어 개발 문제 해결 가이드: LeetCode 440 문제 풀이
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
바이브코딩
대상자
- 초보 프로그래머 및 알고리즘 문제 해결자
- 난이도: 중급 → 고급 (구현 복잡도는 낮지만, 수학적 사고와 트리 탐색 개념이 필요)
핵심 요약
- 문제의 핵심: 수치의 사전 순서(lexicographical order)를 기반으로 k-th 작은 수를 찾는 알고리즘
- 핵심 기법: 거리 계산(gap) 함수를 사용한 트리 탐색 + 그리디 알고리즘
- 시간 복잡도: O(log n * log n) (트리의 깊이와 gap 계산 복잡도)
- 핵심 코드:
```cpp
long getGap(long a, long b, long n) { ... }
```
섹션별 세부 요약
1. 문제 정의 및 예시
- 입력:
n = 13, k = 2
→ 출력:10
- 사전 순서 목록:
[1,10,11,12,13,2,3,4,5,6,7,8,9]
- 문제의 핵심:
1~n
범위 내에서 사전 순서로 정렬된 배열의 k-th 요소를 반환
2. 트리 구조와 탐색 접근
- 10-ary 트리 형태로 사전 순서를 시각화 (예:
1 → 10 → 100...
) - preorder traversal 방식으로 트리 탐색
- gap 계산:
a
와a+1
사이의 수의 개수를 계산하여 탐색 방향 결정
3. 알고리즘 구현
- gap 계산 함수
getGap
:
```cpp
long getGap(long a, long b, long n) {
long gap = 0;
while (a <= n) {
gap += min(n + 1, b) - a;
a *= 10;
b *= 10;
}
return gap;
}
```
- 주요 로직:
- gap
이 k
보다 작으면 자식 노드 탐색 (multiplying by 10)
- gap
이 k
보다 크면 다음 형제 노드로 이동 (increment a
)
4. 시간/공간 복잡도 분석
- 시간 복잡도:
O(log n * log n)
(트리의 깊이가log n
수준) - 공간 복잡도:
O(1)
(추가 데이터 구조 없이 구현)
결론
- 실무 팁:
gap
계산을 통해 전체 목록을 생성하지 않고도 효율적으로 탐색 가능 - 핵심 전략: 수학적 트리 탐색 + 그리디 알고리즘 활용
- 예시:
n = 1000000, k = 1000
→ 수십만 수치를 탐색하지 않고도 빠른 계산 가능