Skip to content

Commit 874fa17

Browse files
committed
resolve 3sum
1 parent 09fbb14 commit 874fa17

File tree

1 file changed

+73
-0
lines changed

1 file changed

+73
-0
lines changed

3sum/Geegong.java

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
import java.util.*;
2+
3+
public class Geegong {
4+
5+
public List<List<Integer>> threeSum(int[] nums) {
6+
7+
// 중복되는 값은 없어야 하기에 HashSet 으로 result
8+
HashSet<List<Integer>> result = new HashSet<>();
9+
10+
// Key : 배열 원소 , value : List<String> 인덱스들
11+
// elementMap 은 two pointer 의 값을 더한 값에서 0이 되기 위한 요소를 찾기위해 사용될 것임
12+
Map<Integer, List<Integer>> elementMap = new HashMap<>();
13+
for (int index = 0; index<nums.length; index++) {
14+
int value = nums[index];
15+
if (elementMap.containsKey(value)) {
16+
List<Integer> indices = elementMap.get(value);
17+
indices.add(index);
18+
elementMap.put(value, indices);
19+
} else {
20+
List<Integer> newIndices = new ArrayList<>();
21+
newIndices.add(index);
22+
elementMap.put(value, newIndices);
23+
}
24+
}
25+
26+
// leftIndex : 0에서 부터 시작하는 index
27+
// rightIndex : nums.length - 1에서부터 감소하는 index
28+
// leftIndex > rightIndex 되는 순간까지만 for문을 돌 것이다.
29+
for (int leftIndex=0; leftIndex < nums.length; leftIndex++) {
30+
for (int rightIndex=nums.length - 1; rightIndex >= 0; rightIndex--) {
31+
32+
if (leftIndex >= rightIndex) {
33+
break;
34+
}
35+
36+
37+
int leftValue = nums[leftIndex];
38+
int rightValue = nums[rightIndex];
39+
40+
int neededValueToZero = -leftValue - rightValue;
41+
if (elementMap.containsKey(neededValueToZero)) {
42+
// elementMap의 value 가 leftIndex, rightIndex 은 아닌지 확인
43+
44+
List<Integer> indices = elementMap.get(neededValueToZero);
45+
// zero 를 만들 수 있는 세번쨰 인덱스가 있는지 확인
46+
int thirdIndex = findThirdIndexToBeZero(leftIndex, rightIndex, indices);
47+
if (-1 != thirdIndex) {
48+
List<Integer> newOne = new ArrayList<>();
49+
newOne.add(nums[leftIndex]);
50+
newOne.add(nums[rightIndex]);
51+
newOne.add(nums[thirdIndex]);
52+
result.add(newOne.stream().sorted().toList());
53+
}
54+
55+
}
56+
57+
}
58+
}
59+
60+
return result.stream().toList();
61+
62+
}
63+
64+
public int findThirdIndexToBeZero(int leftIndex, int rightIndex, List<Integer> indices) {
65+
for (int index : indices) {
66+
if (index != leftIndex && index != rightIndex) {
67+
return index;
68+
}
69+
}
70+
71+
return -1;
72+
}
73+
}

0 commit comments

Comments
 (0)