
03. PickTwoAddMore
Sunhyup Lee. (2024). To be a successful candidate for the coding test. goldenrabbit. p.115.
Problem solving
숫자 배열에서 서로 다른 두 수를 선택해서 더한 결과를 모두 구하고 오름차순으로 정렬해서 반환하자 허나, 중복값은 허용하지 않는다.
① The first way to solve the problem : for문 이용해서 풀기
function solution(numbers) {
const ret = [];
for (let i = 0; i < numbers.length; i++) {
for (let j = 0; j < i; j++) {
ret.push(numbers[i] + numbers[j]);
}
}
return [...new Set(ret)].sort((a, b) => a - b);
🧐 시간복잡도는 어떨까?
[Done] exited with code=0 in 0.06 seconds
1) 이중루프: O(n2)
2) 중복 제거 및 정렬: O(n2 log n)
최종 시간 복잡도: O(n2 log n))
② The second way to solve the problem : 배열의 모든 쌍을 미리 계산 후 중복 제거 및 정렬
function solution(numbers) {
const ret = [];
numbers.forEach((num1, index1) => {
numbers.slice(index1 + 1).forEach(num2 => {
ret.push(num1 + num2);
});
});
return [...new Set(ret)].sort((a, b) => a - b);
}
🧐 시간복잡도는 어떨까?
[Done] exited with code=0 in 0.062 seconds
1) 이중 forEach
루프: O(n2)
2) 중복제거 및 정렬: O(n2 log n) 소요
최종 시간 복잡도: O(n2 log n))
③ The third way to solve the problem : 재귀적 접근
function solution(numbers) {
function combine(nums, start, result) {
if (start >= nums.length) return;
for (let i = start + 1; i < nums.length; i++) {
result.add(nums[start] + nums[i]);
}
combine(nums, start + 1, result);
}
const result = new Set();
combine(numbers, 0, result);
return Array.from(result).sort((a, b) => a - b);
}
🧐 시간복잡도는 어떨까?
[Done] exited with code=0 in 0.067 seconds
1) 재귀 호출과 이중 for 루프: O(n2)
2) 중복제거 및 정렬: O(n2 log n) 소요
최종 시간 복잡도: O(n2 log n))
④ The fourth way to solve the problem : Map을 사용한 접근
function solution(numbers) {
const sumMap = new Map();
for (let i = 0; i < numbers.length; i++) {
for (let j = i + 1; j < numbers.length; j++) {
const sum = numbers[i] + numbers[j];
sumMap.set(sum, true);
}
}
return Array.from(sumMap.keys()).sort((a, b) => a - b);
}
🧐 시간복잡도는 어떨까?
[Done] exited with code=0 in 0.071 seconds
1) 이중 루프와 Map 저장: O(n2)
2) 중복제거 및 정렬: O(n2 log n) 소요
최종 시간 복잡도: O(n2 log n))
⑤ The fifth way to solve the problem : 배열 메서드를 활용한 함수형 접근
function solution(numbers) {
return numbers.flatMap((num, i) =>
numbers.slice(i + 1).map(num2 => num + num2)
)
.filter((val, index, self) => self.indexOf(val) === index)
.sort((a, b) => a - b);
}
🧐 시간복잡도는 어떨까?
[Done] exited with code=0 in 0.068 seconds
1) flatMap 및 slice: O(n2)
2) filter를 통한 중복 제거: O(n3)
3) 정렬: O(n2 log n)
최종 시간 복잡도: O(n3)
⑥ The sixth way to solve the problem : 직접 인덱스 쌍을 만들어서 접근
function solution(numbers) {
const pairs = [];
for (let i = 0; i < numbers.length - 1; i++) {
for (let j = i + 1; j < numbers.length; j++) {
pairs.push(numbers[i] + numbers[j]);
}
}
return [...new Set(pairs)].sort((a, b) => a - b);
}
🧐 시간복잡도는 어떨까?
[Done] exited with code=0 in 0.095 seconds
1) 이중루프: O(n2)
2) 중복제거: O(n2)
3) 정렬: O (n2 log n)
최종 시간 복잡도: O(n log n) + O(n) = O(n2 log n)