LeetCode 440: K-th Smallest Lexicographical Number Solution
AI Store에서 AI코딩으로 만들어진 앱을 만나보세요!
지금 바로 방문하기

프로그래밍/소프트웨어 개발 문제 해결 가이드: 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 계산: aa+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;

}

```

  • 주요 로직:

- gapk보다 작으면 자식 노드 탐색 (multiplying by 10)

- gapk보다 크면 다음 형제 노드로 이동 (increment a)

4. 시간/공간 복잡도 분석

  • 시간 복잡도: O(log n * log n) (트리의 깊이가 log n 수준)
  • 공간 복잡도: O(1) (추가 데이터 구조 없이 구현)

결론

  • 실무 팁: gap 계산을 통해 전체 목록을 생성하지 않고도 효율적으로 탐색 가능
  • 핵심 전략: 수학적 트리 탐색 + 그리디 알고리즘 활용
  • 예시: n = 1000000, k = 1000수십만 수치를 탐색하지 않고도 빠른 계산 가능