카테고리 없음

[코테] 프로그래머스 Lv0 최빈값 구하기

찹쌀뗙 2023. 3. 22. 14:05
반응형

최빈값 구하기

총 3개의 방법으로 구해보겠습니다

 

1.

function solution(arr) {
  let counts = {};
  let maxCount = 0;
  let mode = -1;

다음 세 줄은 세 가지 변수를 정의합니다. counts는 배열에 있는 각 값의 개수를 저장하는 데 사용되는 빈 객체이고, maxCount는 0으로 초기화되어 발견된 가장 높은 개수를 추적하는 데 사용되며, mode는 -1로 초기화되고 발견된 가장 빈번한 값을 추적하는 데 사용됩니다.

 

 for (let i = 0; i < arr.length; i++) {
    counts[arr[i]] = (counts[arr[i]] || 0) + 1;
    if (counts[arr[i]] > maxCount) {
      maxCount = counts[arr[i]];
      mode = arr[i];
    } else if (counts[arr[i]] === maxCount) {
      mode = -1;
    }
  }
  
    return mode;
}
  • 이 루프는 배열의 각 값을 반복하고 이에 따라 counts 개체를 업데이트합니다.
  • counts[arr[i]] = (counts[arr[i]] || 0) + 1; 행은 counts 객체의 현재 값을 증가시킵니다. 현재 값이 아직 counts 개체에 없으면 먼저 해당 값을 0으로 초기화합니다.
  • 다음 두 개의 if 문은 현재 값의 카운트가 지금까지 찾은 maxCount보다 큰지 확인합니다. 그렇다면 그에 따라 maxCount 및 mode를 업데이트합니다. 현재 값의 카운트가 maxCount와 같으면 mode를 -1로 설정하여 여러 모드가 있음을 나타냅니다.
  • 발견된 가장 빈번한 값을 반환하거나 모드가 여러 개인 경우 -1을 반환합니다.

 

2.

let counts = arr.reduce((acc, val) => {
    acc[val] = (acc[val] || 0) + 1;
    return acc;
  }, {});
  let maxCount = 0;
  let mode = -1;
  • 이 코드는 솔루션 1과 유사하지만 루프를 사용하여 counts 개체를 업데이트하는 대신 reduce 메서드를 사용하여 동일한 작업을 수행합니다.
  • reduce 메서드는 배열의 각 값을 반복하고 각 값의 개수를 포함하는 단일 개체를 반환합니다.
  • maxCount 및 mode 변수는 솔루션 1과 동일한 값으로 초기화됩니다.
for (let val in counts) {
    if (counts[val] > maxCount) {
      maxCount = counts[val];
      mode = Number(val);
    } else if (counts[val] === maxCount) {
      mode = -1;
    }
  }
   return mode;
}
  • 이 루프는 1과 동일한 논리를 사용하여 counts 개체의 각 속성을 반복하고 이에 따라 maxCount 및 mode를 업데이트합니다.
  • 발견된 가장 빈번한 값을 반환하거나 모드가 여러 개인 경우 -1을 반환합니다.

3

let counts = new Map();
  let maxCount = 0;
  let mode = -1;
  • 3개의 변수를 초기화합니다. counts는 배열에 각 값의 개수를 저장하는 새로운 Map 개체이고, maxCount는 0으로 초기화되어 발견된 가장 높은 개수를 저장하며, mode는 다음과 같이 초기화됩니다. -1 가장 자주 찾은 값을 저장합니다.
 for (let val of arr) {
    counts.set(val, (counts.get(val) || 0) + 1);
    if (counts.get(val) > maxCount) {
      maxCount = counts.get(val);
      mode = val;
    } else if (counts.get(val) === maxCount) {
      mode = -1;
    }
  }
  return mode;
}
  • 이 루프는 배열의 각 값을 반복하고 이에 따라 counts 개체를 업데이트합니다.
  • counts.set(val, (counts.get(val) || 0) + 1); 행은 counts 객체의 현재 값을 증가시킵니다. 현재 값이 아직 counts 개체에 없으면 || 연산자를 사용하여 먼저 해당 값을 0으로 초기화합니다.
  • 다음 두 개의 if 문은 현재 값의 카운트가 지금까지 찾은 maxCount보다 큰지 확인합니다. 그렇다면 그에 따라 maxCount 및 mode를 업데이트합니다. 현재 값의 카운트가 maxCount와 같으면 mode를 -1로 설정하여 여러 모드가 있음을 나타냅니다.

 

세 가지 방법 중 reduce를 사용하는 2번 방법이 시간적인 측면에서 가장 효율적이다.

 

반응형