https://programmers.co.kr/learn/courses/30/lessons/64065
function solution(s) {
s = s.replace(/[{},]/g, ' ')
let tmp = s.split(' ');
let obj = {};
tmp.forEach(el => {
(Object.keys(obj).indexOf(el) != -1)? obj[el] += 1: obj[el] = 1
})
let keys = Object.keys(obj);
keys.splice(keys.indexOf(''),1);
let answer = keys
.map((el) => {
return[parseInt(el), obj[el]];
}).sort((a, b) => {
return b[1] - a[1];
}).map((el) => {
return el[0]
});
return answer;
}
let s = "{{20,111},{111}}"
console.log(solution(s));
처음에 문제가 이해가 잘 안되서 그냥 중복 되지 않는 배열을 도출해내면 되는 건줄알았다.
그래서 Set을 이용해 중복제거한 배열을 출력해냈는데 정답이 나오지 않았다.
그래서 테스트케이스에 답이 나오는 기준(규칙?)이 뭔지 확인해봤다.
기준은 배열 s가 주어지면 각 원소가 많이 나온 순서대로 answer에 집어넣어야 답이 나온다.
"{{2},{2,1},{2,1,3},{2,1,3,4}}"의 경우
2가 4, 1이 3, 3이 2, 4가 1
answer = 2 1 3 4
"{{1,2,3},{2,1},{1,2,4,3},{2}}"의 경우
2가 4, 1이 3, 3이 2, 4가 1
answer = 2 1 3 4
"{{20,111},{111}}"의 경우
20이 1, 111이 2
answer = 111 20
"{{4,2,3},{3},{2,3,4,1},{2,3}}"의 경우
4가 2, 2가 3, 3이 4, 1이 1
answer = 3 2 4 1
처음 정답은 for문을 여러번 사용해서 답을 구했다.
function solution(s) {
s = s.replace(/[{},]/g, ' ')
// console.log(s)
let tmp = s.split(' ');
let obj = {};
tmp.forEach(el => {
(Object.keys(obj).indexOf(el) != -1)? obj[el] += 1: obj[el] = 1
})
let sortable = [];
let keys = Object.keys(obj);
for (let i = 0; i < keys.length; i++) {
if (keys[i] == '') continue;
else {
sortable.push([parseInt(keys[i]), obj[keys[i]]]);
}
}
sortable.sort((a, b) => {
return b[1] - a[1];
})
// console.log(sortable);
let answer = [];
sortable.forEach(el => {
answer.push(el[0]);
})
return answer;
}
정답이 맞는지 확인 후 sortable부분을 map을 이용해서 합칠 수 있겠다는 생각이 들어 map을 사용해 하나의 배열로 줄여서 answer를 바로도출 해냈다.
let keys = Object.keys(obj);
keys.splice(keys.indexOf(''),1);
let answer = keys
.map((el) => {
return[parseInt(el), obj[el]];
}).sort((a, b) => {
return b[1] - a[1];
}).map((el) => {
return el[0]
});