알고리즘

[알고리즘]프로그래머스 LV.1 - 숫자짝꿍(JS)

로돌씨 2024. 6. 21. 16:12

문제

예제

 

풀이

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을 리턴하도록 했다.