문제 이해하기
숫자 배열을 첫 번째이자 유일한 인수로 받는 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 객체 활용하기
위 방식은 각 요소마다 indexOf와 lastIndexOf를 호출하므로 시간 복잡도가 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])); // trueSet 방식은 단 한 번의 순회로 확인할 수 있어 시간 복잡도가 O(n)이며, 코드도 훨씬 짧고 가독성이 좋습니다. 실무에서는 대부분 이 방식을 권장합니다.