본문 바로가기

백준 2910 - 빈도정렬 JS 본문

개발/algorithm

백준 2910 - 빈도정렬 JS

자전하는명왕성 2023. 9. 8. 08:57
반응형

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

 

이 문제는 그 말마따나 등장 빈도가 높은 순서대로 정렬, 등장 빈도가 같을 시 등장 순서대로 정렬하는 문제다.

 

문제를 해결하기 위해

객체에 각 숫자의 등장 빈도를 기록하고, 해당 객체를 정렬하는 방식으로 답을 구했다.

// 입력값 
// 5 2
// 2 1 2 1 2

const fs = require('fs')
const input = fs.readFileSync(process.platform === "linux" ? "/dev/stdin":"입력.txt")
  .toString().trim().split('\n')

function solution(data) {
  data.shift()

  // 객체 생성
  const table = {}
  const arr = data[0].split(' ')
  // 단축평가를 활용한 등장횟수 기록
  arr.forEach((el)=> table[el] = (table[el] || 0) + 1)

  // 객체 정렬
  const sorted = Object.entries(table).sort((a,b)=> {
  	// 등장 횟수 내림차순 정렬
    if(a[1] !== b[1]) return b[1] - a[1]
    // 등장 순서 오름차순 정렬
    else return arr.indexOf(a[0]) - arr.indexOf(b[0])
  })

  // 정답 배열
  let result = []
  sorted.forEach((el)=> {
  	// n = 숫자 / times = 등장횟수
    const [n, times] = el
    // 숫자 n으로 times 만큼 채워진 배열 생성
    const temp = Array.from({length : times}, ()=> n)
    // 배열 합치기
    result = [...result, ...temp]
  })

  console.log(result.join(' '))
}

solution(input)
반응형
Comments