백준

[백준 2108] 통계학 / 배열 요소의 최빈값 구하기 / Object.entries()

mark340 2023. 1. 14. 19:43

https://www.acmicpc.net/problem/2108

 

2108번: 통계학

첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.

www.acmicpc.net

 

 

셋째 줄 최빈값 구하는것 때문에 애를 많이 먹었습니다.

 

let input = z.toString().trim().split('\n').map(Number)

let N = input[0]  // 개수
const arr = input.slice(1);  // 정수 배열

let a = Math.round(arr.reduce((acc,cur) => acc+cur) / N ) // 1. 산술평균
let b = arr.sort((a,b) => a-b)[parseInt(arr.length/2)] // 2. 중앙값
let d = Math.max(...arr)-Math.min(...arr) // 4. 범위(최댓값 최솟값 차이)


//3. 최빈값 구하기

let map = new Map();  // 중복된 값의 개수를 적장하기 위한 객체 선언
arr.forEach((item) => {
  map[item] = (map[item] || 0) + 1;  // arr배열의 원소들을 순회하며 key,value 생성
                                     // key=원소 value=1씩 추가
                                    // 초기엔 객체에 값이 없기 때문에 0으로 세팅
})
  // Map(0) {
  //   '1': 1,
  //   '2': 1,
  //   '3': 1,
  //   '8': 1,
  //   '-2': 1,
  //.....}

let frequent = Object.entries(map).sort((a,b) => b[1]-a[1] || a[0]-b[0])
// Object.entries() 를 사용하여 객체를 배열로 생성
// 최빈값을 구하기 위해 정렬 => 최빈값이 같은 경우를 위해 요소를 오름차순으로 추가 정렬
// [
//   [ '-2', 1 ],
//   [ '1', 1 ],
//   [ '2', 1 ],
//   [ '3', 1 ],
//   [ '8', 1 ]
// ]
let c = 0;
if(frequent.length>=2){  // 정수 입력값이 여러개일 경우
  if(frequent[0][1] == frequent[1][1]){  // 최빈값이 여러개일 경우
    c = frequent[1][0]  // 최빈값중 두번째로 작은 값 !!
    } else {
    c = frequent[0][0]
  }
} else {
  c = frequent[0][0]
}

console.log(`${a}
${b}
${c}
${d}`)

 

Object.entries() 함수

Object.entries() 함수는 객체에서 [Key, Value] 형식의 값을 배열로 반환합니다.

let strObj = {
  A : 'A string',
  B : 'B string',
  C : 'C string'
};

let strArr = Object.entries(strObj);

console.log(strArr);
// [['A', 'A string'], ['B', 'B string'], ['C', 'C string']]

 

Object.keys() 함수

Object.keys() 함수는 객체에서 key를 문자열 배열로 반환합니다.

Object.values() 함수

Object.values() 함수는 객체에서 값을 문자열 배열로 반환합니다.

 

 

배열에 있는 값들의 중복 횟수 확인

1. forEach() 이용

const arr = ['a', 'b', 'a', 'b', 'c'];

const result = {};
arr.forEach((x) => { 
  result[x] = (result[x] || 0)+1; 
});

document.write(JSON.stringify(result));


// {"a":2,"b":2,"c":1}

 

2. reduce() 이용

 

const arr = ['a', 'b', 'a', 'b', 'c'];

const result = arr.reduce((accu, curr) => { 
  accu[curr] = (accu[curr] || 0)+1; 
  return accu;
}, {});

document.write(JSON.stringify(result));

// {"a":2,"b":2,"c":1}