정수 배열을 첫 번째이자 유일한 인수로 받는 JavaScript 함수를 작성해야 합니다.
이 함수는 배열에 존재하는 모든 정수가 고유한 횟수(즉, 서로 다른 정수 간에 출현 횟수가 겹치지 않는지)로 나타나는지 판별해야 합니다. 조건을 만족하면 true, 그렇지 않으면 false를 반환합니다.
문제 이해하기
예를 들어, 입력 배열이 다음과 같다고 가정해 보겠습니다.
const arr = [7, 5, 5, 8, 2, 4, 7];
이 경우 기대되는 출력은 다음과 같습니다.
const output = false;
그 이유는 정수 7과 5가 각각 2번씩 나타나기 때문입니다. 출현 횟수가 중복되므로 '고유한 출현 횟수' 조건을 충족하지 못합니다.
접근 방법
이 문제는 두 단계로 해결할 수 있습니다.
- 해시 맵(Hash Map)으로 빈도수 계산: 각 정수를 해당 정수의 출현 횟수에 매핑합니다.
- Set으로 고유성 검사: 해시 맵의 값들을 순회하면서 Set에 저장하고, 이미 존재하는 빈도수가 발견되면 즉시
false를 반환합니다. 모든 빈도수가 고유하다면 최종적으로true를 반환합니다.
구현 코드
다음은 위 접근 방식을 구현한 전체 코드입니다.
const arr = [7, 5, 5, 8, 2, 4, 7];
const uniqueAppearances = (arr = []) => {
const map = {};
const set = new Set();
// 1단계: 각 요소의 빈도수 계산
for(let i = 0; i < arr.length; i++){
const el = arr[i];
map[el] = (map[el] || 0) + 1;
};
// 2단계: 빈도수의 고유 여부 검사
for(let key in map){
const value = map[key];
if(set.has(value)){
return false;
};
set.add(value);
};
return true;
};
console.log(uniqueAppearances(arr));실행 결과
위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.
false
동작 원리 살펴보기
배열 [7, 5, 5, 8, 2, 4, 7]의 각 요소별 빈도수는 다음과 같습니다.
- 7 → 2번
- 5 → 2번
- 8 → 1번
- 2 → 1번
- 4 → 1번
여기서 빈도수 2가 두 번(7과 5), 빈도수 1이 세 번(8, 2, 4) 나타나므로 출현 횟수가 고유하지 않습니다. 따라서 함수는 false를 반환하게 됩니다.
이처럼 해시 맵과 Set을 조합하면 시간 복잡도 O(n)으로 효율적으로 문제를 해결할 수 있습니다.