문제 정의
배열과 하나의 숫자를 입력받아, 배열 안에서 인접한 두 요소의 합이 주어진 숫자와 일치하는 첫 번째 쌍을 찾고, 그 쌍 중 첫 번째 요소의 인덱스를 반환하는 함수를 작성해야 합니다.
만약 조건을 만족하는 쌍이 배열에 존재하지 않는다면 -1을 반환하도록 구현합니다.
여기서 말하는 '쌍(pair)'은 배열에서 임의로 선택된 두 요소가 아니라, 서로 붙어 있는(연속된) 두 요소를 의미한다는 점에 유의하세요. 즉, arr[i]와 arr[i+1]의 관계만 검사하게 됩니다.
구현 코드
이 로직은 간단한 반복문으로 해결할 수 있습니다. 배열을 처음부터 끝까지 순회하면서 현재 요소와 다음 요소의 합을 목표값과 비교하고, 일치하는 지점에서 즉시 인덱스를 반환합니다.
const arr = [4, 8, 2, 7, 6, 42, 41, 77, 32, 9];
const findPair = (arr, num) => {
for(let i = 0; i < arr.length; i++){
if(arr[i] + arr[i+1] === num){
return i;
}
};
return -1;
};
console.log(findPair(arr, 13));
console.log(findPair(arr, 48));
console.log(findPair(arr, 45));동작 원리
함수의 작동 방식은 다음과 같습니다.
- 인덱스 0부터 배열 길이까지 순회하면서 arr[i] + arr[i+1]이 num과 같은지 확인합니다.
- 조건을 만족하는 위치를 발견하면 해당 인덱스 i를 즉시 반환합니다.
- 반복문이 끝날 때까지 일치하는 쌍을 찾지 못했다면 -1을 반환합니다.
출력 결과
위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.
3 4 -1
각 결과의 근거는 아래와 같습니다.
- findPair(arr, 13): arr[3] + arr[4] = 7 + 6 = 13이므로 인덱스 3을 반환합니다.
- findPair(arr, 48): arr[4] + arr[5] = 6 + 42 = 48이므로 인덱스 4를 반환합니다.
- findPair(arr, 45): 합이 45가 되는 인접한 쌍이 없으므로 -1을 반환합니다.
이 알고리즘은 배열을 한 번만 순회하므로 시간 복잡도는 O(n)입니다. 단순 선형 탐색으로 문제를 해결하는 전형적인 패턴이며, 인접 요소 기반 조건 검사가 필요한 다양한 상황에 응용할 수 있습니다.