문제
나의코드
const solution = (number) => {
let count = 0;
number.sort((x,y) => x-y);
for(let i = 0; i < number.length -1; i++) {
let findSum = -number[i];
for(let leftIndex = i+1; leftIndex < number.length-1; leftIndex++) {
let rightIndex = number.length-1;
while(leftIndex < rightIndex) {
let nowSum = number[leftIndex] + number[rightIndex];
if(nowSum > findSum) {
--rightIndex;
} else if(nowSum === findSum){
++count;
--rightIndex;
} else if(nowSum < findSum) {
break;
}
}
}
}
return count;
}
로직흐름
- 문제를 정리하면, 3개의 숫자를 골라서 이것의 합이 0이 되는 조합이 몇개인지 반환하는 문제이다.
- number배열을 작은 숫자부터 정렬을 했다.
- 하나 요소를 딱 정한다음 그 나머지 요소들 중에 두개의 합이 하나의 요소에 마이너스 부호가 된 값이여야 한다.
- 나머지 요소 들중에 두개를 꺼내서 그 두개의 합을 알아야 하기 때문에 인덱스를 leftIndex, rightIndex 두개를 만들었다.
- leftIndex는 2.에서 고른 요소의 인덱스값+1부터 number.length -2까지이다.
- rightIndex는 number.length -1인덱스부터 lefthIndex+1까지다.
- 만약 두 요소의 합이 찾아야 하는 합보다 크다면 rightIndex를 하나 줄였다.
- 만약 두 요소의 합이 찾아야 하는 합보다 작다면 현재 leftIndex로 찾아야 하는 합을 만들 수 없으므로 반복을 멈춘다.
- 만약 두 요소의 합이 찾아야 하는 값이라면 count를 +1해줬다.
- leftIndex가 rightIndex보다 작을 때까지 반복되며,
- 이 두 인덱스가 같아지면, 다음 leftIndex로 넘어간다.