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

JavaScript 배열에서 값과 빈도가 같은 숫자 찾기

문제 소개

이번 글에서는 정수로 이루어진 배열을 입력받아, 배열 안에 자신의 등장 횟수(빈도)와 값이 동일한 정수가 존재하는지 확인하는 JavaScript 함수를 작성하는 방법을 알아보겠습니다.

문제 설명

함수는 정수 배열을 유일한 인수로 받습니다. 함수의 역할은 다음과 같습니다.

  • 배열을 순회하면서 각 정수의 빈도(등장 횟수)를 계산합니다.
  • 빈도가 값 자체와 일치하는 정수가 하나라도 존재하면 해당 정수를 반환합니다.
  • 조건을 만족하는 정수가 없다면 -1을 반환합니다.

예시

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

const arr = [3, 4, 3, 8, 4, 9, 7, 4, 2, 4];

이 배열에서 3은 2번, 4는 4번 등장합니다. 여기서 4는 값도 4이고 등장 횟수도 4이므로 조건을 만족합니다. 따라서 기대되는 출력은 다음과 같습니다.

const output = 4;

구현 코드

다음은 위 문제를 해결하는 전체 코드입니다.

const arr = [3, 4, 3, 8, 4, 9, 7, 4, 2, 4];
const checkValueFrequency = (arr = []) => {
    const map = {};
    for(let i = 0; i < arr.length; i++){
        const el = arr[i];
        map[el] = (map[el] || 0) + 1;
    };
    for(key in map){
        if(+key === map[key]){
            return +key;
        };
    };
    return -1;
};
console.log(checkValueFrequency(arr));

코드 설명

동작 과정을 단계별로 살펴보면 다음과 같습니다.

  1. 먼저 각 숫자의 등장 횟수를 저장할 빈 객체(map)를 생성합니다.
  2. 첫 번째 반복문에서 배열의 모든 요소를 순회하며, 각 숫자의 빈도를 map에 누적합니다. (map[el] || 0) + 1 표현식은 해당 숫자가 처음 등장했을 때 0에서 시작해 1씩 증가시키는 역할을 합니다.
  3. 두 번째 반복문에서 map의 키를 순회하면서, 키(숫자 값)와 저장된 빈도가 일치하는지 확인합니다. 객체의 키는 문자열이므로 단항 연산자 +를 사용해 숫자로 변환한 뒤 비교합니다.
  4. 일치하는 값을 찾으면 즉시 반환하고, 끝까지 찾지 못하면 -1을 반환합니다.

출력 결과

위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.

4

이처럼 객체를 활용해 빈도를 한 번의 순회로 계산한 뒤 조건을 확인하면, 시간 복잡도 O(n)으로 효율적으로 문제를 해결할 수 있습니다.