문제
예제
풀이
function solution(X, Y) {
let answer = '';
let num = [];
// 문자열 X와 Y를 배열로 변환하고 정렬
X = X.split("").sort((a, b) => a - b);
Y = Y.split("").sort((a, b) => a - b);
// 숫자의 빈도를 저장할 맵
let xCount = new Map();
let yCount = new Map();
// X의 각 숫자의 빈도 계산
for (let x of X) {
//x가 없는 경우에는 0으로 계산하고 1을 더함 ,
//x가 이미 있는경우에는 x의 밸류값에 1을 한번더 더해 빈도수를 구함
xCount.set(x, (xCount.get(x) || 0) + 1);
}
// Y의 각 숫자의 빈도 계산
for (let y of Y) {
yCount.set(y, (yCount.get(y) || 0) + 1);
}
// 공통으로 나타나는 숫자의 최소 빈도를 찾아 num 배열에 추가
for (let [key, value] of xCount) {
console.log(key,value)
//xCount의 두가지 요소를 [key, value]형식으로 저장함
//만약 yCount에도 똑같은 이름의 key를 가지고있다면
if (yCount.has(key)) {
//yCount와 xCount에서 둘중 가장 작은값을 구함
// value -> x의 빈도 , yCount.get(key) -> yCount에서 같은 이름을 가진 키의 밸류값을 얻어내는것
let minCount = Math.min(value, yCount.get(key));
//num에minCount만큼의 key를 넣음
//ex ) 4가나온 횟수가 둘다 최소 2이다 .
// minCount -> 2 / key -> 4
for (let i = 0; i < minCount; i++) {
num.push(key);
}
}
}
if (num.length == 0) {
return "-1";
} else if (num.every(n => n == '0')) {
return "0";
} else {
return num.sort((a, b) => b - a).join("");
}
}
Map 요소의 key와 value를 [key,value]로 빼낼 수 있는걸 배웠다.
문제만 보면 두 배열의 수에서 중복된 수를 구해 정렬하면 되는 간단한 문제처럼 보였지만 반복문을 사용해서 중복된 수를 구하려니 계속 오류가 나고 제대로 구하기도 힘들었다. map을 이용해 숫자가 나오는 빈도를 카운트했고 그 숫자를 key값으로 , x와 y에 같은 수가 있다면 . 그수의 빈도에서 둘중 더 낮은값 ( 공통으로 나왔을 떄에 중복되는 수) 만큼 배열에 추가를 해주어 정렬하고 문자열로 변환 하니 값을 찾을 수있었고 제한사항에 있는 배열에 값이 하나도없다면 -1 리턴 , 그리고 0이 두번나오면 00이되는 경우가 생기기에 만약 0이 중복으로 나오게 되었을때에 배열을 reduce를 이용해 모든 값을 더했을때에 0이라면 0을 리턴하도록 했다.
'알고리즘' 카테고리의 다른 글
[알고리즘]프로그래머스 LV.1 - 바탕화면 정리 (0) | 2024.07.02 |
---|---|
[알고리즘]프로그래머스 LV.1 - 크레인 인형뽑기(JS) (0) | 2024.06.25 |
[알고리즘]프로그래머스 LV.1 - 체육복(JS) (0) | 2024.06.21 |
[알고리즘]프로그래머스LV.1 - 대충 만든 자판(JS) (0) | 2024.06.19 |
[알고리즘] 프로그래머스 LV.1 - 모의고사(JS) (1) | 2024.06.13 |