|
| 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 | + |
| 21 | + function dfs(arr,start,dep){ |
| 22 | + if(dep == 3) { |
| 23 | + if(arr.length !==3) return |
| 24 | + const arrTotal = arr.reduce((a,b)=>a+b,0); |
| 25 | + if(arrTotal == 0){ |
| 26 | + const string = [...arr].sort((a,b)=>a-b).join(',') |
| 27 | + if(!seen.has(string)){ |
| 28 | + seen.add(string) |
| 29 | + ret.push(arr) |
| 30 | + } |
| 31 | + } |
| 32 | + return |
| 33 | + } |
| 34 | + //๋ง์ฝ start๊ฐ 0์ด ๋๋ฉด, i๋ฅผ ๊ฐ์์์ผ์ผํ๊ณ , ์๋ก์ด ๋ฐฐ์ด์ ์ถ๊ฐํด์ผํ๋ค. ๊ธฐ์กด์ ๋ฐฐ์ด์ ๋ฃ์ด์ฃผ๋๊ฒ ์๋๋ค. |
| 35 | + |
| 36 | + //๋์ ์ ์ฆ๊ฐ์ํค๋ฉด์ ์งํํด์ผํจ. ํ์ฌ ๊ณ ์ arr์ ๋์ ๊ทธ ์์ idx๋ถํฐ ์งํํด์ 0๊น์ง ๊ฐ์์ํค๋ฉด์ dfs๋ฅผ ๋๋ฆฌ๋ฉด ๋๋ค. |
| 37 | + //idx๊ฐ i-1๋ถํฐ์ด๋ฏ๋ก, i๋ ์ต์ 1์ด์ด์ผ ๊ฐ๋ฅํ๋ค. |
| 38 | + for(let idx = start; idx<numsLength; idx++){ |
| 39 | + // currArr.push([...arr,nums[idx]]) |
| 40 | + //ํ์ฌ i์ ๋ํ ํ์ฌ currArr๋ฅผ ๋ง๋ค์ด์ค๋ค. |
| 41 | + //๋ง๋ค์ด์ค ๊ฐ Arr์ ๋ํด์, ๋ค์ dfs๋ก ๋ค์ด๊ฐ์, ๊ฐ ๋ฐฐ์ด์ ๋ด๋ถ์ ํฉ์ด 0์ธ์ง ํ์ธํ๊ณ , |
| 42 | + //ํ์ฌ ๋ฐฐ์ด์ ๋ํ set์ ๋ํด์ ์ค๋ณต์ด ๋๋ ๊ฒ์ ์๋์ง ํ์ธํ๋ฉด์ ๋ฃ์ด์ค๋ค. |
| 43 | + dfs([...arr,nums[idx]],idx+1,dep+1) |
| 44 | + }} |
| 45 | + dfs([],0,0) |
| 46 | + //๋ง์ง๋ง์ set์ผ๋ก triples์ ์ค๋ณต์ ์ ๊ฑฐํด์ค์ผํ๋ค. |
| 47 | + |
| 48 | + return ret |
| 49 | +}; |
| 50 | + |
| 51 | +/* |
| 52 | +์๊ฐ๋ณต์ก๋: |
| 53 | +nums.sort((a, b) => a - b): ๋ฐฐ์ด ์ ๋ ฌ์ O(NlogN) |
| 54 | +
|
| 55 | +N๊ฐ ์ซ์ ์ค 3๊ฐ ์ ํํ๋ ์กฐํฉ ์ N(Nโ1)(Nโ2)/6 |
| 56 | +์ ํํ ์ ์๋ ์์ง๋ง, |
| 57 | +
|
| 58 | +N^3 ์ด์์ผ๋ก ๋ณด์. |
| 59 | +
|
| 60 | +๊ณต๊ฐ๋ณต์ก๋ : O(N^3) => seen ๋๋ฌธ. |
| 61 | +
|
| 62 | +*/ |
| 63 | + |
| 64 | +//2. ํฌํฌ์ธํฐ๋ก ํ๊ธฐ |
| 65 | + |
| 66 | +/* |
| 67 | +์ฐ์ ๋ด๊ฐ ๋ฌธ์ ์ ๋ํ ์ดํด๊ฐ ํ๋ ธ๋ค. ์ซ์์ ์์๊ฐ ๋ค๋ฅด๋ค๊ณ ํ๋๋ผ๋, ๊ฐ์ ์ซ์์ ์กฐํฉ์ ๊ฐ์ง๊ณ ์๋ค๋ฉด ์๋๋ค. |
| 68 | +๊ฐ์ด ์ํ๋ ๊ฐ๋ณด๋ค ์์ผ๋ฉด ์ค๋ฅธ์ชฝ ๊ฐ์ ์ฎ๊ธฐ๊ณ , ํฌ๋ฉด ์ผ์ชฝ ๊ฐ์ ์ฎ๊ธฐ๋ ํฌํฌ์ธํฐ ์ ๋ต์ ์ทจํด๋ณด์๋ค. |
| 69 | +
|
| 70 | + */ |
| 71 | + |
| 72 | +/** |
| 73 | + * @param {number[]} nums |
| 74 | + * @return {number[][]} |
| 75 | + */ |
| 76 | +var threeSum = function(nums) { |
| 77 | + const triplets = [] |
| 78 | + nums.sort((a,b)=>a-b) |
| 79 | + for(let i =0;i<nums.length -2 ;i++){ |
| 80 | + if (i > 0 && nums[i] === nums[i - 1]) continue; |
| 81 | + let low = i+1 |
| 82 | + ,high = nums.length -1 |
| 83 | + |
| 84 | + while(low < high){ |
| 85 | + const three_sum = nums[i] + nums[low] + nums[high] |
| 86 | + if(three_sum<0){ |
| 87 | + low +=1 |
| 88 | + } |
| 89 | + else if(three_sum >0){ |
| 90 | + high -=1 |
| 91 | + } |
| 92 | + else{ |
| 93 | + triplets.push([nums[i],nums[low],nums[high]]) |
| 94 | + while (low < high && nums[low] === nums[low + 1]) low++; |
| 95 | + while (low < high && nums[high] === nums[high - 1]) high--; |
| 96 | + low = low+1 |
| 97 | + high = high -1 |
| 98 | + } |
| 99 | + } |
| 100 | + } |
| 101 | + return triplets |
| 102 | +}; |
0 commit comments