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

JavaScript에서 배열 요소가 모두 고유한지 확인하는 방법

문제 이해하기

숫자 배열을 첫 번째이자 유일한 인수로 받는 JavaScript 함수를 작성해야 합니다. 이 함수는 배열의 모든 숫자가 한 번씩만 나타나는 경우, 즉 모든 숫자가 고유(unique)하면 true를 반환하고, 하나라도 중복되면 false를 반환해야 합니다.

예를 들어 입력 배열이 다음과 같다고 가정해 보겠습니다.

const arr = [12, 45, 6, 34, 12, 57, 79, 4];

이 경우 출력은 다음과 같아야 합니다.

const output = false;

그 이유는 배열 안에서 숫자 12가 두 번 등장하기 때문입니다.

구현 예시: indexOf와 lastIndexOf 활용

이 문제는 indexOf()lastIndexOf() 메서드를 활용해 해결할 수 있습니다. 각 요소에 대해 첫 번째 인덱스와 마지막 인덱스를 비교했을 때 두 값이 다르다면, 해당 요소가 배열에 두 번 이상 존재한다는 의미입니다.

const arr = [12, 45, 6, 34, 12, 57, 79, 4];
const containsAllUnique = (arr = []) => {
    const { length: l } = arr;
    for(let i = 0; i < l; i++){
        const el = arr[i];
        const firstIndex = arr.indexOf(el);
        const lastIndex = arr.lastIndexOf(el);
        if(firstIndex !== lastIndex){
            return false;
        };
    };
    return true;
};
console.log(containsAllUnique(arr));

실행 결과

콘솔에 출력되는 결과는 다음과 같습니다.

false

더 효율적인 대안: Set 객체 활용하기

위 방식은 각 요소마다 indexOflastIndexOf를 호출하므로 시간 복잡도가 O(n²)에 가깝습니다. 더 간결하고 빠른 방법은 Set 객체를 사용하는 것입니다. Set은 중복된 값을 저장하지 않으므로, 배열을 Set으로 변환한 뒤 크기를 비교하면 됩니다.

const containsAllUnique = (arr = []) => {
    return new Set(arr).size === arr.length;
};
console.log(containsAllUnique([12, 45, 6, 34, 12, 57, 79, 4])); // false
console.log(containsAllUnique([1, 2, 3, 4, 5])); // true

Set 방식은 단 한 번의 순회로 확인할 수 있어 시간 복잡도가 O(n)이며, 코드도 훨씬 짧고 가독성이 좋습니다. 실무에서는 대부분 이 방식을 권장합니다.