K-Distant 인덱스 찾기 문제 요약
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
- 소프트웨어 개발자 및 알고리즘 문제 풀이 준비자
- 난이도: 중간
- 포인터 기반 그리디 알고리즘 이해가 필요
- 중복된 인덱스 검사를 방지하는 전략 필요
핵심 요약
- 그리디 알고리즘과 포인터를 활용한 O(n) 시간 복잡도 접근법
start
포인터로 중복된 인덱스 검사 방지nums[j] == key
인 인덱스j
주변k
범위의 인덱스i
를 모두 포함i - k <= j <= i + k
조건 적용- C++, Python, JavaScript 구현 예시 포함
start
변수는min(n-1, i + k)
범위 내에서만 처리
섹션별 세부 요약
1. 문제 정의
- 입력: 배열
nums
, 정수key
, 정수k
- 출력:
nums[j] == key
인 인덱스j
와|i - j| <= k
조건을 만족하는 인덱스i
의 오름차순 배열 - 예시:
nums = [1,2,3,4,5], key = 3, k = 1
→i = 2, 3, 4
2. 알고리즘 접근법
- Greedy + 포인터 전략
key
가 있는 인덱스j
를 기준으로j - k
부터j + k
까지 인덱스i
추가start
포인터로 이전에 처리한 인덱스 재검사 방지- 시간 복잡도:
O(n)
(배열 한 번만 순회) - 공간 복잡도:
O(1)
(결과 배열 제외)
3. 코드 구현
- C++
```cpp
vector
vector
int n = nums.size();
int start = 0;
for(int i=0; i if(nums[i] == key) { int left = max(0, i - k); int right = min(n-1, i + k); while(start <= right) { if(start >= left) ans.push_back(start); start++; } } } return ans; } ``` ```python def findKDistantIndices(self, nums: List[int], key: int, k: int) -> List[int]: ans = [] n = len(nums) start = 0 for i in range(n): if nums[i] == key: left = max(0, i - k) right = min(n - 1, i + k) while start <= right: if start >= left: ans.append(start) start += 1 return ans ```
4. 효율성 분석
start
포인터로 left
범위 이전의 인덱스는 무시n
번의 루프로 O(n)
start
변수만 사용결론
start
포인터로 중복 검사 최소화key
가 빈번하게 나타나는 경우 k
범위가 겹칠 수 있으므로 start
변수 관리 중요k
값이 배열 길이보다 클 경우 left = 0
, right = n-1
로 자동 조정nums = [2,2,2,2,2], key = 2, k = 1
→ [0,1,2,3,4]