/*
문제
Write a function called sumZero,
which accepts a sorted array of integers.
The function should find the first pair where
the sum is 0. Return an array that includes both
values that sum to zero or undefined if a pair
does not exist
*/
function sumZero(arr) {
// 투 포인터 문제
let idx = 0;
let idx_ = arr.length - 1;
if (arr[idx] >= 0 || arr[idx_] <= 0){
return undefined;
}
while (arr[idx] < 0 && arr[idx_] > 0) {
while (arr[idx_] > 0 && Math.abs(arr[idx]) <= arr[idx_]) {
if (!(arr[idx] + arr[idx_])) {
return [arr[idx], arr[idx_]];
} else {
idx_--;
}
}
idx++;
}
return undefined;
}
console.log(sumZero([-3, -2, -1, 0, 1, 2, 3])); // [-3, 3]
console.log(sumZero([ -2, -1, 0, 3])); // undefined
console.log(sumZero([1,2,3])); // undefined
console.log(sumZero([ -2, -1, 1, 3])); // [-1, 1]
해설
// 시간 복잡도 O(N^2)
// 공간 복잡도 0(1)
function sumZero_(arr) {
for (let i = 0; i < arr.length; i++) {
for (let j = i + 1; j < arr.length; j++) {
if (arr[i] + arr[j] === 0) {
return [arr[i], arr[j]];
}
}
}
return undefined;
}
console.log(sumZero_([-3, -2, -1, 0, 1, 2, 3])); // [-3, 3]
console.log(sumZero_([-2, -1, 0, 3])); // undefined
console.log(sumZero_([1, 2, 3])); // undefined
console.log(sumZero_([-2, -1, 1, 3])); // [-1, 1]
better practice
조건문을 너무 형편없이 쓴 것 같다.
while문을 굳이 2번 사용할 필요도 없었다.
밑에는 이상적인 답변이다.