Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript 배열에서 첫 번째 중복 숫자의 인덱스 찾기

배열에서 가장 먼저 두 번 이상 등장하는 요소의 인덱스를 반환하는 함수를 작성해야 합니다. 만약 어떤 요소도 두 번 이상 등장하지 않는다면 -1을 반환하면 됩니다.

여기서 핵심 조건은 상수 공간(constant space), 즉 추가적인 메모리를 사용하지 않고 문제를 해결해야 한다는 점입니다.

접근 방법

이 문제는 for 루프로 배열을 순회하면서, Array.prototype.lastIndexOf() 메서드를 활용해 현재 요소가 배열 안에서 중복되어 있는지 확인하는 방식으로 해결할 수 있습니다.

lastIndexOf()는 특정 값이 마지막으로 나타나는 인덱스를 반환합니다. 따라서 현재 인덱스 i와 그 결과값이 다르다면, 해당 값이 배열의 다른 위치에도 존재한다는 뜻이며, 이때 현재 인덱스를 바로 반환하면 됩니다.

예제 코드

const firstDuplicate = arr => {
    for(let i = 0; i < arr.length; i++){
        if(arr.lastIndexOf(arr[i]) !== i){
            return i;
        };
    };
    return -1;
}
console.log(firstDuplicate([3, 5, 6, 8, 5, 3])); // 0
console.log(firstDuplicate([0, 1, 2, 3, 4, 4, 5])); // 4
console.log(firstDuplicate([0, 1, 1, 2, 3, 4, 4, 5])); // 1
console.log(firstDuplicate([0, 1, 2, 3, 4, 9, 5])); // -1

실행 결과

콘솔에는 아래와 같은 결과가 출력됩니다.

0
4
1
-1

시간 복잡도 분석

각 요소마다 lastIndexOf()를 호출하기 때문에 시간 복잡도는 O(n²)입니다. 대신 추가 배열이나 객체를 사용하지 않으므로 공간 복잡도는 O(1)로 유지됩니다. 데이터 크기가 작거나 메모리 사용량이 중요한 환경이라면 충분히 실용적인 접근 방식입니다.