본문으로 바로가기

baekjoon. 통계학

category Algorithm/문제 2021. 1. 2. 13:55

풀이

문제에 나와있는데로 풀면 되는 문제라 딱히 풀이랄게 없다

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