
정렬된 정수의 배열를 받아 합이 0이 되는 한쌍의 숫자를 배열 형태로 리턴하는 sumZero 함수를 작성하시오.
(합이 0인 한 쌍이 존재하지 않으면 undefined 리턴)sumZero([-3,-2,-1,0,1,2,3]) // [-3,-3]
sumZero([-2,0,1,3]) // undefined
sumZero([1,2,3]) // undefined
🔸 풀이 전 어떻게 구성할지 생각해봤다
🔸 위의 내용을 코드로 구성해보면
const sumZero = (intArr) => {
let left = 0; //첨
let right = intArr.length - 1; //끝
while (left < right) {
const sum = intArr[left] + intArr[right];
if (sum === 0) return [intArr[left], intArr[right]];
else if (sum > 0) right--;
else left++;
}
};
시간 복잡도 O(N), 공간 복잡도 O(1) => 해답도 내가 했던 풀이와 동일했다 🤓
아래의 코드의 성능의 경우 시간복잡도 O(n^2) , 공간 복잡도 O(1)와 같다.
const sumZeroUseNL = (intArr) => {
for (let i = 0; i < intArr.length; i++) {
for (let j = j + 1; j < intArr.length; j++) {
if (intArr[i] + intArr[j] === 0) {
return [intArr[i], intArr[j]];
}
}
}
};
내가 했던 풀이와 동일~!
정렬된 정수의 배열을 받아 배열의 고유값의 갯수를 리턴하는 countUniqueValues 함수를 작성하시오
(음수가 올 수 있다, 배열은 항상 sort된 상태이다)countUniqueValues([1,1,1,1,1,2])//2
countUniqueValues([1,2,3,4,4,4,5,5,12,12,13]) //7
countUniqueValues([])//0
countUniqueValues([-2,-1,-1,0,1]) //3
🔸 풀이 전 어떻게 구성할지 생각해봤다
[-1,1] => -1과 1 고유값 2가지🔸 위의 내용을 코드로 구성해보면
const countUniqueValues = (intArr) => {
if (intArr.length === 0) return 0;
let basis = 0;
let round = 1;
let count = 1;
while (round < intArr.length) {
const baseElem = intArr[basis];
const roundElem = intArr[round];
if (baseElem !== roundElem) count++;
basis++;
round++;
}
return count;
};
while을 사용한 풀이 => 알고리즘 풀이 과정만 보고 다시 구성해 봄!
const solCountuniqueValues = (intArr) => {
if (intArr.length === 0) return 0; // 빈 배열은 비교 할 필요 없으니 바로 0 리턴
let basis = 0;
let round = 1;
while (round < intArr.length) {
if (intArr[basis] !== intArr[round]) {
basis++;
intArr[basis] = intArr[round];
}
round++;
}
return basis + 1;
};
1)변수선언
basis : 기준점
round : index를 증가시키며 비교하는 값
2)과정
basis와 round 위치의 같으면 round 인덱스 증가
basis와 round 위치의 값이 다르면 basis 인덱스 증가 후 해당 자리에 비교값 할당, round 인덱스 증가
3)리턴값
해당 작업 반복 후 round의 인덱스가 배열 마지막 인덱스가 되면 basis 의 index+1(인덱스는 0부터 시작하므로) 리턴
위의 내용을 for loop를 이용해 다시 리팩토링😎
//풀이
const solCountuniqueValues = (intArr) => {
if (intArr.length === 0) return 0; // 빈 배열은 비교 할 필요 없으니 바로 0 리턴
let i = 0;
for (let j = 0; j < intArr.length; j++) {
if(intArr[i] !== intArr[j]) {
i++;
intArr[i] = intArr[j];
}
}
return i + 1;
};