알고리즘

[BOJ] 2108 - 통계학 (JS)

로돌씨 2024. 10. 8. 19:22

 

나의 풀이

let fs = require("fs");

let input = fs.readFileSync('예제.txt').toString().trim().split("\n");
const N = input.shift();

    var answer1 = Math.round(input.map(Number).reduce((a,b) => a+b) / N)
    console.log(Math.abs(answer1))

    var sortArr = input.map(Number).sort((a,b)=> b-a)
    var answer2 = sortArr[Math.round(N/2)-1]

    console.log (answer2)

    let map = new Map()
    for(let i = 0; i < N ; i++){
       if(map.has(input[i])){
          map.set(input[i] , map.get(input[i]) + 1 )
       }else{
        map.set(input[i] , 1 )
        }
    }
    let maxValue = -Infinity;
    let maxKeys = [];
    
          // 모든 [key, value] 쌍을 순회하며 최대값을 찾음
        for (let [key, value] of map) {
        if (value > maxValue) {
            maxValue = value;
            maxKeys = [key];  // 새로운 최대값이 나타나면, 배열 초기화 후 키 추가
        } else if (value === maxValue) {
            maxKeys.push(key);  // 동일한 최대값일 경우 키를 추가
        }
    }
    console.log(maxKeys.map(Number).sort((a,b) => a-b)[1] || maxKeys[0])

  
    
    let maxNum = Math.max(...input.map(Number))
    let minNum = Math.min(...input.map(Number))
    
    console.log(maxNum - minNum)

 

어째서인지 84퍼센트에서 계속 실패했다... 뭐가 문제인지 전혀 예상이가지도않고 찾을수가없었다 ... 반례를 찾다가 평균이 -0으로 출력되는 경우가 있다고해서 , 평균 구하는 식에 if문을 추가해 다시 작성했다.

 

수정한 풀이

let fs = require("fs");

// 입력 파일 읽어오기
let input = fs.readFileSync('/dev/stdin').toString().trim().split("\n");
const N = parseInt(input.shift()); // 첫 번째 줄에서 N 값 추출

// 1. 평균값 구하기 (소수점 이하 반올림)
let numbers = input.map(Number); // 문자열을 숫자로 변환
let answer1 = Math.round(numbers.reduce((a, b) => a + b) / N);

if(answer1 == -0){
    console.log(0)
}else{
    console.log(answer1);
}


// 2. 중앙값 구하기 (오름차순 정렬 후 중간 값 출력)
let sortedNumbers = numbers.slice().sort((a, b) => a - b); // 오름차순 정렬
let answer2 = sortedNumbers[Math.floor(N / 2)];
console.log(answer2);

// 3. 최빈값 구하기
let map = new Map();
for (let num of numbers) {
    map.set(num, (map.get(num) || 0) + 1); // 각 숫자의 빈도수 계산
}

// 최빈값 찾기
let maxValue = Math.max(...map.values()); // 가장 높은 빈도수
let maxKeys = [...map.entries()]
    .filter(([key, value]) => value === maxValue) // 최빈값인 항목들 필터링
    .map(([key]) => key)
    .sort((a, b) => a - b); // 오름차순 정렬

// 최빈값이 여러 개일 경우 두 번째로 작은 값 출력, 하나면 그 값 그대로 출력
let answer3 = (maxKeys.length > 1) ? maxKeys[1] : maxKeys[0];
console.log(answer3);

// 4. 범위 구하기 (최대값 - 최소값)
let maxNum = Math.max(...numbers);
let minNum = Math.min(...numbers);
console.log(maxNum - minNum);

 

결과는 성공이였다... 너무 허무했다. 아니 허무라기보단 ... 이런 경우도 있으니 잘 체크를 해야겠다 .

푸하하하