[백준-node.js-20920] 영단어 암기는 괴로워

이태헌·2023년 6월 13일
0
post-thumbnail

문제

https://www.acmicpc.net/step/20920

풀이

	let input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n')
	let [N,M] = [input[0].split(' ')[0],input[0].split(' ')[1]]
    input.shift();
    
    let arr = input.filter((el)=>{ // [1]
      if(el.length >= parseInt(M)) return el;
    }).sort().sort((a,b)=>b.length - a.length)

    let map = new Map()
    for(let x of arr){ //[2]
      if(map.has(x)) map.set(x,map.get(x)+1)
      else map.set(x,1)  
    }
    
    let sortArr = [...map].sort((a,b)=>b[1]-a[1]) //[3]
    
    let sortTmp = []
    for(let x of sortArr){
      sortTmp.push(x[0]) //[4]
    }
    
    console.log(sortTmp.join('\n'))
  1. 받아온 배열을 filter함수를 통해서 첫번째 조건으로 길이가 4인 원소만 리턴하고 sort함수로 알파벳순으로 정렬한 후 sort함수로 길이에 따라서 내림차순으로 정렬한다
  2. Map을 만들어서 정렬된 배열에서 같은 인덱스의 갯수를 넣어준다
  3. Map을 배열로 변환시켜서 갯수에 따라서 sort함수로 정렬
  4. 새로운 배열에 이름 부분만 푸쉬해주기

다른 풀이

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

let [N, M] = input[0].split(' ').map(v=>+v);
let freq = new Map();
for (let i = 1; i < input.length; i++) {
    if (input[i].length >= M) freq.set(input[i], (freq.get(input[i])||0)+1);
}

freq = [...freq].sort((a,b)=>{
    if (a[1]===b[1]) {
        if (a[0].length === b[0].length) {
            return a[0] < b[0] ? -1 : 1;
        } else {
            return b[0].length-a[0].length;
        }
    } else {
        return b[1]-a[1];
    }
}).map(v=>v[0]).join('\n');

console.log(freq);

받아온 inputfor문을 돌면서 길이가 M보다 큰 수를 Map에다가 바로 넣었고 배열로 만들어서 sort함수로 검사할때 단어의 갯수가 같은 경우와 다른경우를 나눠서 정렬하였다.
숫자가 같을때는 길이를 검사해서 길이가 같다면 문자순으로 정렬하고 아니면 길이순으로 정렬하면서 원소의 숫자가 같지 않을때는 내림차순으로 sort()문을 하나로 다 정리했다! 👍🏻

0개의 댓글