Sqsung DevLog

[백준] 4358번: 생태학 (Node.js) 본문

Algorithm

[백준] 4358번: 생태학 (Node.js)

sqsung 2023. 5. 18. 11:14

백준에서 4358번: 생태학 (난이도: Silver II) 확인하기 
 

4358번: 생태학

프로그램은 여러 줄로 이루어져 있으며, 한 줄에 하나의 나무 종 이름이 주어진다. 어떤 종 이름도 30글자를 넘지 않으며, 입력에는 최대 10,000개의 종이 주어지고 최대 1,000,000그루의 나무가 주어

www.acmicpc.net

1. 풀이 

const trees = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');

console.log(
  (() => {
    const TOTAL = trees.length;
    const counts = {};

    let answer = '';

    trees.forEach(tree => {
      counts[tree] ? (counts[tree] += 1) : (counts[tree] = 1);
    });

    const keys = Object.keys(counts);
    const percentageObjs = [];

    keys.forEach(key => {
      percentageObjs.push({ name: key, percentage: ((counts[key] / TOTAL) * 100).toFixed(4) });
    });

    percentageObjs.sort((a, b) => {
      if (a.name < b.name) return -1;
      if (a.name > b.name) return 1;

      return 0;
    });

    percentageObjs.forEach(({ name, percentage }) => {
      answer += `${name} ${percentage}` + '\n';
    });

    return answer.trim();
  })()
);

 

1-1. 접근 방식 

입력 값으로 받은 나무들을 순회하면서 count 객체에 나무로 된 key 값이 이미 있는 경우 value를 1씩 증가해줬고, 없는 경우 새로운 프로퍼티를 생성하고 value를 1로 초기화했다. 

 

이후 나무 정보를 사전순으로 정렬하기 위해 다시 반복문을 돌면서 나무 종과 해당 종이 차지하는 비율을 정리해둔 객체를 생성하고, 이를 새로운 배열에 담아줬다.

 

사전순 정렬 후에는 배열을 순회하면서 answer 변수에 종의 이름과 비율을 문자열 형태로 넣어준 뒤 반환했다.