Skip to content

Commit e8d4b4a

Browse files
committed
add: solve #241 3Sum with ts
1 parent 35ffaec commit e8d4b4a

File tree

1 file changed

+52
-0
lines changed

1 file changed

+52
-0
lines changed

3sum/Yjason-K.ts

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/**
2+
* 세 수의 합이 0이 되는 모든 고유한 조합을 찾는 함수
3+
*
4+
* @param {number[]} nums - 정수 배열
5+
* @returns {number[][]} - 세 수의 합이 0이 되는 조합 배열
6+
*
7+
* 1. 입력 배열 `nums`를 오름차순으로 정렬.
8+
* 2. 이중 반복문을 사용하여 각 요소를 기준으로 `투 포인터(two-pointer)`를 이용해 조합을 탐색.
9+
* 3. 중복 조합을 방지하기 위해 `Set`을 사용하여 결과 조합의 문자열을 저장.
10+
* 4. 조건에 맞는 조합을 `result` 배열에 추가합니다.
11+
*
12+
* 시간 복잡도:
13+
* - 정렬: O(n log n)
14+
* - 이중 반복문 및 투 포인터: O(n^2)
15+
* - 전체 시간 복잡도: O(n^2)
16+
*
17+
* 공간 복잡도:
18+
* - `Set` 및 `result` 배열에 저장되는 고유 조합: O(k), k는 고유한 조합의 수
19+
* - 전체 공간 복잡도: O(n + k)
20+
*/
21+
function threeSum(nums: number[]): number[][] {
22+
const sumSet = new Set<string>();
23+
const result: number[][] = [];
24+
nums.sort((a, b) => a - b);
25+
26+
// 첫 번째 요소를 기준으로 반복문 수행
27+
for (let i = 0; i < nums.length - 2; i++) {
28+
// 정렬 된 상태이기 때문에 시작점을 기준으로 다음 값 중복 비교
29+
if (i > 0 && nums[i] === nums[i - 1]) continue;
30+
31+
let start = i + 1, end = nums.length - 1;
32+
while (start < end) {
33+
const sum = nums[i] + nums[start] + nums[end];
34+
if (sum > 0) {
35+
end--;
36+
} else if (sum < 0) {
37+
start++;
38+
} else {
39+
const triplet = [nums[i], nums[start], nums[end]];
40+
const key = triplet.toString();
41+
if (!sumSet.has(key)) {
42+
sumSet.add(key);
43+
result.push(triplet);
44+
}
45+
start++;
46+
end--;
47+
}
48+
}
49+
}
50+
51+
return result;
52+
}

0 commit comments

Comments
 (0)