짝수 길이의 정수 배열 arr를 입력으로 받아, 특정 조건을 만족하는 두 숫자의 쌍을 찾아 반환하는 JavaScript 함수를 작성해야 합니다.
문제 이해하기
배열에서 인접한 두 요소씩 짝지어 각 쌍의 제곱합을 구하고, 그 값들을 모두 곱한 수를 num이라고 정의합니다 −
num = (arr[0] * arr[0] + arr[1] * arr[1]) * (arr[2] * arr[2] + arr[3] * arr[3]) * … * (arr[n-2] * arr[n-2] + arr[n-1] * arr[n-1])
여기서 n은 배열의 길이입니다.
함수는 다음 등식을 만족하는 두 숫자 [A, B]를 찾아 반환해야 합니다 −
A2 + B2 = num
입출력 예시
배열이 다음과 같다고 가정해 보겠습니다 −
[1, 2, 3, 4]
그러면 num = (1 + 4) × (9 + 16) = 5 × 25 = 125가 됩니다.
따라서 함수의 출력은 다음과 같아야 합니다 −
[2, 11]
실제로 22 + 112 = 4 + 121 = 125이므로 조건을 만족합니다.
구현 코드
다음은 해당 문제를 해결하는 전체 코드입니다 −
const arr = [1, 2, 3, 4];
const findMatchingSumArray = (arr = []) => {
let squaredSum = 1;
for(let i = 0; i < arr.length - 1; i += 2){
const curr = arr[i];
const next = arr[i + 1];
squaredSum *= (Math.pow(curr, 2) + Math.pow(next, 2));
};
for(let k = 0; k * k < squaredSum; k++){
for(let j = 0; (k * k) + (j * j) <= squaredSum; j++){
if((k * k) + (j * j) === squaredSum){
return [k, j];
};
};
};
return [];
};
console.log(findMatchingSumArray(arr));
코드 동작 원리
이 알고리즘은 크게 두 단계로 진행됩니다.
1단계 — 목표값 계산: 첫 번째 반복문은 배열을 두 칸씩 건너뛰며 인접한 두 요소의 제곱합을 구하고, 그 결과를 누적으로 곱해 최종 목표값인 squaredSum을 산출합니다.
2단계 — 쌍 탐색: 중첩 반복문을 사용해 A2 + B2 = num을 만족하는 자연수 쌍을 하나씩 검사합니다. 조건에 부합하는 쌍을 발견하면 즉시 [k, j] 형태의 배열을 반환하며, 끝까지 찾지 못한 경우 빈 배열을 반환합니다.
출력 결과
코드 실행 시 콘솔에 출력되는 결과는 다음과 같습니다 −
[2, 11]