File tree Expand file tree Collapse file tree 1 file changed +52
-0
lines changed Expand file tree Collapse file tree 1 file changed +52
-0
lines changed Original file line number Diff line number Diff line change 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+ }
You can’t perform that action at this time.
0 commit comments