[Lv2, 63%, JS] 튜플

오늘처음해요·2024년 1월 21일
0

문제



내 답

function solution(s) {
    const obj = {};
    s.replace(/[{}]/g,'').split(',').forEach(el => {
        if(!obj[el])obj[el]=0;
        obj[el] += 1;
    })
    return Object.entries(obj).sort((a,b) => b[1]-a[1]).map(el => +el[0]);
}

내 고민

문제를 처음 봤을 때는
각 집합 안에서 많이 중복된 횟수를 기준으로
정렬 후에 리턴하면 끝나는 간단한 문제일 거라 생각했다.

가장 큰 문제는 "{{2},{2,1},{2,1,3},{2,1,3,4}}"
이러한 형식으로 주어지는 입력값을
어떻게 가공할지 였다

Array.from(s).filter
이런 식으로 쓰면 두 자리 수를 구별할 수 없어서 고민했다

그러다 떠올린 방법은 split, replace
억지로 가공해버려야겠다고 생각했다
(좋은 코드는 아니어도 문제를 풀어내는 게 1순위이니)


s.replace(/[{}]/g,'').split(',')

/* 
	s :	"{{20,111},{111}}"
	replace(/[{}]/g,'') : "20,111,111"
	split(',') : ["20","111","111"]

*/

중괄호들을 없애고 배열로 다시 담아줬다



const obj = {};
s.replace(/[{}]/g,'').split(',').forEach(el => {
        if(!obj[el])obj[el]=0;
        obj[el] += 1;
})

// {"20":1,"111":2}

이후 배열을 순회하면서 객체에 숫자가 중복된 수를 넣어줬다


return Object.entries(obj).sort((a,b) => b[1]-a[1]).map(el => +el[0]);

/*
	Object.entries(obj) : [["20",1],["111",2]]
    sort((a,b) => b[1]-a[1]) : [["111",2],["20",1]]
	map(el => +el[0]) : [111, 20]
*/

객체를 키, 값으로 구성된 배열로 만들어주고
중복된 수를 기준으로 내림차순 정렬을 했다
이후 키를 숫자로 변환 후에 리턴했다.


배운 점

내 방식이 꽤나 무식하고 위험하지 않을까 생각했는데
다른 사람들도 비슷한 접근법으로 해결하려고 하는 것을 보고
코테에서는 이런 방식이 나쁘지 않구나 생각했다

0개의 댓글