|
| 1 | +// package _sum |
| 2 | +package main |
| 3 | + |
| 4 | +import ( |
| 5 | + "slices" |
| 6 | + "strconv" |
| 7 | +) |
| 8 | + |
| 9 | +/* |
| 10 | + * 첫 번째 수 n1 |
| 11 | + * 두 번째 수 n2 |
| 12 | + * 세 번째 수 n3 일때, |
| 13 | + * 2sum 문제와 동일하게 map에 모든 수를 맵핑하여 |
| 14 | + * 두가지 수를 계산하여 얻을 수 있는 세가지 수가 map에 있는지를 확인하여 |
| 15 | + * 중복되지 않도록 결과를 map에 저장 -> [][]int로 반환 |
| 16 | + * 시간 복잡도: O(N^2) |
| 17 | + * 공간 복잡도: O(N) |
| 18 | + */ |
| 19 | +func threeSum(nums []int) [][]int { |
| 20 | + triplets := make(map[string][]int) |
| 21 | + for i, n1 := range nums[:len(nums)-2] { |
| 22 | + seen := make(map[int]int) |
| 23 | + for _, n2 := range nums[i+1:] { |
| 24 | + target := -n1 - n2 |
| 25 | + if _, ok := seen[target]; ok { |
| 26 | + item := []int{n1, n2, target} |
| 27 | + slices.Sort(item) |
| 28 | + key := strconv.Itoa(item[0]) + strconv.Itoa(item[1]) + strconv.Itoa(item[2]) |
| 29 | + triplets[key] = item |
| 30 | + } |
| 31 | + seen[n2] = n2 |
| 32 | + } |
| 33 | + } |
| 34 | + |
| 35 | + ret := make([][]int, 0) |
| 36 | + for _, t := range triplets { |
| 37 | + ret = append(ret, t) |
| 38 | + } |
| 39 | + return ret |
| 40 | +} |
| 41 | + |
| 42 | +/* |
| 43 | + * 따로 맵핑하여 첫 번째 수를 고정 후, 2,3 번째 수를 순회하며 도는 첫 번째 방식과 동일하게 O(N^2) 비용은 유지 |
| 44 | + * 되지만, 공간 복잡도 면에서 O(N) -> O(1)로 개선이 됨. |
| 45 | + */ |
| 46 | +func threeSum2(nums []int) [][]int { |
| 47 | + slices.Sort(nums) |
| 48 | + triplets := make(map[string][]int, 0) |
| 49 | + |
| 50 | + for i := 0; i < len(nums); i++ { |
| 51 | + l, h := i+1, len(nums)-1 |
| 52 | + for l < h { |
| 53 | + sum := nums[l] + nums[h] + nums[i] |
| 54 | + if sum < 0 { |
| 55 | + l++ |
| 56 | + } else if sum > 0 { |
| 57 | + h-- |
| 58 | + } else { |
| 59 | + k := strconv.Itoa(nums[l]) + strconv.Itoa(nums[h]) + strconv.Itoa(nums[i]) |
| 60 | + nums := []int{nums[i], nums[l], nums[h]} |
| 61 | + triplets[k] = nums |
| 62 | + l++ |
| 63 | + h-- |
| 64 | + } |
| 65 | + } |
| 66 | + } |
| 67 | + ret := make([][]int, 0) |
| 68 | + for _, t := range triplets { |
| 69 | + ret = append(ret, t) |
| 70 | + } |
| 71 | + return ret |
| 72 | +} |
0 commit comments