풀이
문제에 나와있는데로 풀면 되는 문제라 딱히 풀이랄게 없다
3번째로 구해야하는 최빈값 정도가 머리를 좀 써야하는 정도?라고 생각해서 바로 코드를 짰다
구현
첫번째
const input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n').map(num => parseInt(num));
input.shift();
const first = Math.round(input.reduce((acc,v)=>{
return acc + v;
},0)/input.length);
const second = input.sort((a, b) => a-b)[Math.floor(input.length/2)];
const third = (input.length-1) ? frequency(input) : input[0];
const four = input[input.length-1] - input[0];
console.log(`${first}\n${second}\n${third}\n${four}`);
function frequency(arr) {
const freArr = {};
let max =-1;
for(let v of arr){
freArr[v] ? freArr[v]++ : freArr[v]=1;
if(freArr[v]>max) max = freArr[v];
}
const many = [];
for(let key in freArr){
if(freArr[key] === max) many.push(key);
}
return many.sort((a, b) => a-b)[1];
}
산술 평균은 reduce를 이용해서 누적합을 구한 뒤 길이로 나누었고
중앙값을 구하기 위해서 sort()메소드를 이용해서 정렬 후 길이를 나누어 내림했다(입력이 홀수개이기에 가능)
범위 출력은 중앙값을 구하면서 정렬된 배열을 이용해서 마지막 값 - 처음 값 해서 구했다
남은 건 최빈값인데 단락 평가를 이용해서 배열에 값이 하나만 있다면 배열의 첫번째 값을, 그게 아니라면 frequency를 호출한다
frequency는 배열을 받고 빈 객체를 만들어서 배열의 값을 key로 빈도수를 value에 누적함과 동시에 max로 최대 빈도수를 계산한다
many 배열에 max와 같은 빈도수를 가진 key들을 넣은 뒤 정렬 후 두번째 값을 가져와 빈도수들 중에 두번째로 적은 수를 출력한다
그렇지만! 틀렸다
frequency에서 빈도수 높은 수가 하나였을 때를 감안하지 못했다..
두번째
function frequency(arr) {
const freArr = {};
let max =-1;
for(let v of arr){
freArr[v] ? freArr[v]++ : freArr[v]=1;
if(freArr[v]>max) max = freArr[v];
}
const many = [];
for(let key in freArr){
if(freArr[key] === max) many.push(key);
}
if(many.length===1) return many[0];
return many.sort((a, b) => a-b)[1];
}
'Algorithm > 문제' 카테고리의 다른 글
algospot. PICNIC (미해결) (0) | 2021.01.10 |
---|---|
baekjoon. 단어 정렬 (0) | 2021.01.04 |
baekjoon. 수 정렬하기 3 (0) | 2021.01.01 |
baekjoon. 수 정렬하기 2 (0) | 2020.12.30 |
baekjoon. 분해합 (0) | 2020.12.29 |