https://www.acmicpc.net/problem/2108
2108번: 통계학
첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.
www.acmicpc.net
문제
수를 처리하는 것은 통계학에서 상당히 중요한 일이다. 통계학에서 N개의 수를 대표하는 기본 통계값에는 다음과 같은 것들이 있다. 단, N은 홀수라고 가정하자.
- 산술평균 : N개의 수들의 합을 N으로 나눈 값
- 중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
- 최빈값 : N개의 수들 중 가장 많이 나타나는 값
- 범위 : N개의 수들 중 최댓값과 최솟값의 차이
N개의 수가 주어졌을 때, 네 가지 기본 통계값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.
출력
첫째 줄에는 산술평균을 출력한다. 소수점 이하 첫째 자리에서 반올림한 값을 출력한다.
둘째 줄에는 중앙값을 출력한다.
셋째 줄에는 최빈값을 출력한다. 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다.
넷째 줄에는 범위를 출력한다.
예제 입력1
5
1
3
8
-2
2
예제 출력1
2
2
1
10
해결 방법
1. 산술평균
-reduce로 전체 합을 구한 후 N으로 나눠준다.
2. 중앙값
-input을 오름차순으로 정렬한다.
-input.length / 2를 Math.floor 했을 때 해당하는 input을 저장한다.
*N이 5인 경우 중앙값은 3, 인덱스로 따지면 0부터 시작이므로 2이다. 따라서 Math.floor를 한다.
3. 최빈값
- 빈 객체와 빈 배열을 만든다.
-문자열에 대해 반복문을 돌면서 만약 객체에 해당 값이 있으면 +1을 아니면 1을 저장한다.
-저장된 객체의 value 중에서 최댓값을 구한다.
-객체를 돌면서 최댓값과 value가 같은 경우 배열에 저장한다.
-배열의 길이가 1보다 큰 경우 오름차순으로 정렬한 후 두 번째로 작은 값을 리턴한다.
-아니면 0번째 값을 리턴한다.
4. 범위
-배열의 최댓값에서 최솟값을 뺀다.
전체 코드
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().trim().split("\n").map(Number);
const N = input.shift();
//산술평균
let avg = Math.round((input.reduce((prev, curr) => prev + curr, 0))/N);
//중앙값
input.sort((a, b) => a -b);
const middle = input[Math.floor(input.length/2)];
//최빈값
function maxChar(string){
const count = {};
let maxChar =[];
for(let char of string){
count[char] = count[char] + 1 || 1;
}
let maxNum = Math.max(...Object.values(count));
for(let char in count){
if(count[char] === maxNum){
maxChar.push(char);
}
}
if(maxChar.length > 1){
maxChar.sort((a, b) => a - b);
return maxChar[1];
} else {
return maxChar[0];
}
}
const maxCount = maxChar(input);
//범위
const range = input[input.length-1] - input[0];
console.log(`${avg}
${middle}
${maxCount}
${range}`)
참고 사이트
문자열 내 최빈값 구하기(MaxChars)
문자열 내에서 가장 많이 등장한 문자를 구해봅시다.
velog.io
https://dpsc615.tistory.com/132
백준 2108번: 통계학 Node.js(JavaScript)
😢 알고리즘을 단계별로 풀었다면, 앞의 지식들을 이용해서 풀어주면 쉽게 가능하다. 코드가 조금 긴 것 같아서, Code Refactoring이 가능할지 고민해 봐야겠다. 😊 산술 평균: arr.reduce함수로 값을
dpsc615.tistory.com
'알고리즘 > 백준' 카테고리의 다른 글
[JavaScript] 백준 좌표 정렬하기 #11650번 (2) | 2022.09.29 |
---|---|
[JavaScript] 백준 정렬 소트인사이드 #1427번 (0) | 2022.09.28 |
[JavaScript] 백준 정렬 커트라인 #25305번 (0) | 2022.09.26 |
[JavaScript] 백준 정렬 수 정렬하기 #2750번 (0) | 2022.09.21 |
[JavaScript] 백준 브루트 포스 #1018번 체스판 다시 칠하기 (0) | 2022.08.31 |