1+ //1.dfs๋ก ํ๊ธฐ : ์๊ฐ์ด๊ณผ ๋จ
2+
3+
4+ /**
5+ * @param {number[] } nums
6+ * @return {number[][] }
7+ */
8+ var threeSum = function ( nums ) {
9+ /*
10+ arr: ํ์ฌ ๊ณ ์ ๋ฐฐ์ด์ ๋ปํจ. dfs๊ฐ ๋๋๋ง๋ค ๋ณ๊ฒฝ๋จ.
11+ start: ๋๋ index. arr์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ด๊ฒ์ for๋ฌธ์์์ ๋ณ๊ฒฝ๋ ์์ .
12+ dep: dep์ ํ์ฌ dfs์ dep+1์ ํด์ฃผ๋ฉด ๋จ.
13+ */
14+ const numsLength = nums . length
15+ if ( numsLength == 3 && nums . reduce ( ( a , b ) => a + b , 0 ) == 0 ) return [ nums ]
16+
17+ const ret = [ ]
18+ const seen = new Set ( ) ;
19+ nums . sort ( ( a , b ) => a - b ) ;
20+ function dfs ( arr , start , dep ) {
21+ if ( dep == 3 ) {
22+ if ( arr . length !== 3 ) return
23+ const arrTotal = arr . reduce ( ( a , b ) => a + b , 0 ) ;
24+ if ( arrTotal == 0 ) {
25+ const string = [ ...arr ] . sort ( ( a , b ) => a - b ) . join ( ',' )
26+ if ( ! seen . has ( string ) ) {
27+ seen . add ( string )
28+ ret . push ( arr )
29+ }
30+ }
31+ return
32+ }
33+ //๋ง์ฝ start๊ฐ 0์ด ๋๋ฉด, i๋ฅผ ๊ฐ์์์ผ์ผํ๊ณ , ์๋ก์ด ๋ฐฐ์ด์ ์ถ๊ฐํด์ผํ๋ค. ๊ธฐ์กด์ ๋ฐฐ์ด์ ๋ฃ์ด์ฃผ๋๊ฒ ์๋๋ค.
34+
35+ //๋์ ์ ์ฆ๊ฐ์ํค๋ฉด์ ์งํํด์ผํจ. ํ์ฌ ๊ณ ์ arr์ ๋์ ๊ทธ ์์ idx๋ถํฐ ์งํํด์ 0๊น์ง ๊ฐ์์ํค๋ฉด์ dfs๋ฅผ ๋๋ฆฌ๋ฉด ๋๋ค.
36+ //idx๊ฐ i-1๋ถํฐ์ด๋ฏ๋ก, i๋ ์ต์ 1์ด์ด์ผ ๊ฐ๋ฅํ๋ค.
37+ for ( let idx = start ; idx < numsLength ; idx ++ ) {
38+ // currArr.push([...arr,nums[idx]])
39+ //ํ์ฌ i์ ๋ํ ํ์ฌ currArr๋ฅผ ๋ง๋ค์ด์ค๋ค.
40+ //๋ง๋ค์ด์ค ๊ฐ Arr์ ๋ํด์, ๋ค์ dfs๋ก ๋ค์ด๊ฐ์, ๊ฐ ๋ฐฐ์ด์ ๋ด๋ถ์ ํฉ์ด 0์ธ์ง ํ์ธํ๊ณ ,
41+ //ํ์ฌ ๋ฐฐ์ด์ ๋ํ set์ ๋ํด์ ์ค๋ณต์ด ๋๋ ๊ฒ์ ์๋์ง ํ์ธํ๋ฉด์ ๋ฃ์ด์ค๋ค.
42+ dfs ( [ ...arr , nums [ idx ] ] , idx + 1 , dep + 1 )
43+ } }
44+ dfs ( [ ] , 0 , 0 )
45+ //๋ง์ง๋ง์ set์ผ๋ก triples์ ์ค๋ณต์ ์ ๊ฑฐํด์ค์ผํ๋ค.
46+
47+ return ret
48+ } ;
49+
50+ /*
51+ ์๊ฐ๋ณต์ก๋:
52+ nums.sort((a, b) => a - b): ๋ฐฐ์ด ์ ๋ ฌ์ O(NlogN)
53+
54+ N๊ฐ ์ซ์ ์ค 3๊ฐ ์ ํํ๋ ์กฐํฉ ์ N(Nโ1)(Nโ2)/6
55+ ์ ํํ ์ ์๋ ์์ง๋ง,
56+
57+ N^3 ์ด์์ผ๋ก ๋ณด์.
58+
59+ ๊ณต๊ฐ๋ณต์ก๋ : O(N^3) => seen ๋๋ฌธ.
60+
61+ */
62+
63+ //2. ํฌํฌ์ธํฐ๋ก ํ๊ธฐ
0 commit comments