반응형
LeetCode 167: Two Sum II - Input Array Is Sorted
📌 문제 설명
주어진 정렬된 배열에서 두 숫자의 합이 주어진 target과 일치하는 인덱스를 반환하는 문제입니다.
배열의 인덱스는 1부터 시작하고, 합이 일치하는 두 숫자의 인덱스를 1-based로 반환해야 합니다.
✅ 풀이 아이디어: Two Pointers 알고리즘
이 문제는 Two Pointers 기법을 사용하여 해결할 수 있습니다.
- 배열이 정렬되어 있음을 이용해 left 포인터는 배열의 앞에서 시작하고, right 포인터는 배열의 끝에서 시작합니다.
- 두 포인터의 합이 target보다 작으면 left를 증가시키고, 합이 크면 right를 감소시킵니다.
- 두 포인터가 가리키는 값이 합이 target과 같다면 그 인덱스를 반환합니다.
- 이러한 방식으로 한 번 순회하여 문제를 해결할 수 있습니다. 이때 **시간 복잡도는 O(n)**입니다.
✅ 구현 코드 (TypeScript)
export function twoSum(numbers: number[], target: number): number[] {
let left = 0;
let right = numbers.length - 1;
while (left < right) {
const sum = numbers[left] + numbers[right];
if (sum === target) {
return [left + 1, right + 1]; // 1-based index
}
if (sum < target) {
left++; // 합이 target보다 작으면 left 포인터를 증가
} else {
right--; // 합이 target보다 크면 right 포인터를 감소
}
}
return [];
}
✅ 테스트 코드 (Jest)
describe("Medium 167: Two Sum II", () => {
it("should return [1, 2] for [2, 7, 11, 15] and target 9", () => {
expect(twoSum([2, 7, 11, 15], 9)).toEqual([1, 2]);
});
it("should return [1, 2] for [-1, 0] and target -1", () => {
expect(twoSum([-1, 0], -1)).toEqual([1, 2]);
});
it("should return [1, 3] for [2, 3, 4] and target 6", () => {
expect(twoSum([2, 3, 4], 6)).toEqual([1, 3]);
});
});
✅ 시간 복잡도
- 시간 복잡도: O(n)
- 배열을 한 번만 순회하므로, 시간 복잡도는 배열의 길이에 비례하여 선형입니다.
- 공간 복잡도: O(1)
- 추가적인 공간을 사용하지 않으므로 공간 복잡도는 상수입니다.
✅ 마무리
이 문제를 풀면서 중간 난이도 문제도 이제는 한 번에 풀 수 있게 된 것 같다는 자신감이 생겼습니다.
Two Pointers 알고리즘을 통해 정렬된 배열에서 빠르게 답을 찾는 기법을 잘 활용한 문제였습니다. 이제는 이런 유형의 문제를 더 잘 풀 수 있을 것 같아요.
반응형
'Algorithm > LeetCode' 카테고리의 다른 글
[Dart/LeetCode 209] Minimum Size Subarray Sum — 슬라이딩 윈도우 알고리즘으로 푸는 최단 부분합 문제 (1) | 2025.04.03 |
---|---|
Dart-LeetCode 11번: Container With Most Water — 투 포인터 전략으로 풀어보기 (0) | 2025.04.02 |
[LeetCode 392] Is Subsequence - 부분 수열 판별하기 (0) | 2025.03.27 |
[LeetCode 125] Valid Palindrome - 유효한 회문 판단하기 (0) | 2025.03.26 |
[LeetCode 68] Text Justification - 텍스트 양쪽 정렬 (0) | 2025.03.25 |