Skip to content

Commit 0b703de

Browse files
committed
add: 3sum 풀이 추가
1 parent 700c896 commit 0b703de

File tree

1 file changed

+72
-0
lines changed

1 file changed

+72
-0
lines changed

3sum/ysle0.go

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
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

Comments
 (0)