🗃️javascript/프로그래머스

숫자 짝꿍(js, Lv.1)[해시맵 사용 연습]

하얀성 2023. 11. 20. 15:47

 

두 정수 X, Y의 임의의 자리에서 공통으로 나타나는 정수 k(0 ≤ k ≤ 9)들을 이용하여 만들 수 있는 가장 큰 정수를 두 수의 짝꿍이라 합니다(단, 공통으로 나타나는 정수 중 서로 짝지을 수 있는 숫자만 사용합니다). X, Y의 짝꿍이 존재하지 않으면, 짝꿍은 -1입니다. X, Y의 짝꿍이 0으로만 구성되어 있다면, 짝꿍은 0입니다.

예를 들어, X = 3403이고 Y = 13203이라면, X와 Y의 짝꿍은 X와 Y에서 공통으로 나타나는 3, 0, 3으로 만들 수 있는 가장 큰 정수인 330입니다. 다른 예시로 X = 5525이고 Y = 1255이면 X와 Y의 짝꿍은 X와 Y에서 공통으로 나타나는 2, 5, 5로 만들 수 있는 가장 큰 정수인 552입니다(X에는 5가 3개, Y에는 5가 2개 나타나므로 남는 5 한 개는 짝 지을 수 없습니다.)
두 정수 X, Y가 주어졌을 때, X, Y의 짝꿍을 return하는 solution 함수를 완성해주세요.

제한사항
  • 3 ≤ X, Y의 길이(자릿수) ≤ 3,000,000입니다.
  • X, Y는 0으로 시작하지 않습니다.
  • X, Y의 짝꿍은 상당히 큰 정수일 수 있으므로, 문자열로 반환합니다.

입출력 예XYresult
"100" "2345" "-1"
"100" "203045" "0"
"100" "123450" "10"
"12321" "42531" "321"
"5525" "1255" "552"

입출력 예 설명

입출력 예 #1

  • X, Y의 짝꿍은 존재하지 않습니다. 따라서 "-1"을 return합니다.

입출력 예 #2

  • X, Y의 공통된 숫자는 0으로만 구성되어 있기 때문에, 두 수의 짝꿍은 정수 0입니다. 따라서 "0"을 return합니다.

입출력 예 #3

  • X, Y의 짝꿍은 10이므로, "10"을 return합니다.

입출력 예 #4

  • X, Y의 짝꿍은 321입니다. 따라서 "321"을 return합니다.

입출력 예 #5

  • 지문에 설명된 예시와 같습니다.

1차 제출시도 답안(실패) 

function solution(X, Y) {
     let result = [];
     let arr1 = [...X]
     let arr2 = [...Y]
     for(let x of arr1){
         if(arr2.indexOf(x) != -1){
             let deleteIndex = arr2.indexOf(x)
             if(result.includes("0") && x === "0")break;
             result.push(x);
             arr2.splice(deleteIndex,1," ")
             // console.log(result+"*")
             // console.log(deleteIndex)
             // console.log(arr2)
         }
     }
     if(result==''){
         return "-1"
     }
    return result.sort().reverse().join("")
}

 

개선코드(더 빨라지긴 했으나 점수에 차이를 보이진 못함)

function solution(X, Y) {
     let result = [];
     let arr1 = [...X]
     let arr2 = [...Y]
     for(let x of arr1){
         if(result.includes("0") && x === "0")break;
         if(arr2.indexOf(x) != -1){
             let deleteIndex = arr2.indexOf(x)
             result.push(x);
             arr2.splice(deleteIndex,1," ")
             // console.log(result+"*")
             // console.log(deleteIndex)
             // console.log(arr2)
         }
     }
     if(result==''){
         return "-1"
     }
    return result.sort().reverse().join("")
}

 


해시를 통해서 짜보도록하겠다.(망했다. 해시 사이 연결을 못하겠다. 그래도 연결하려고 애쓰긴 했는데 중복되는 연결에 있어선 스스로 코드를 마무리 못하겠다. 어떻게든 마무리는 지었지만 틀렸다.)

(해시맵도 직접 구현해보고 적용해본다고 3시간 정도 쓴듯?)

function solution(X, Y) {
    function hash(str){
        let findedWords = [...str]
        const count = new Map();
    
        findedWords.forEach(word => {
        if(count.has(word) && word != "0"){
            count.set(word, count.get(word) + 1);
        }else{
            count.set(word,1);
        }
    })
    return count    
    }
    console.log([...hash(X).keys()])
    console.log(hash(Y))
    const hashY = hash(Y)
    let common = [];
    let Xindexes = [...hash(X).keys()]
    let Yindexes = [...hashY.keys()]
    for(let x of Xindexes){
        if(Yindexes.includes(x)){
            common.push(x)
        }
    }
    return common === ""? "-1" : common.join("") 

챗gpt의 해시를 통한 답(이것도 런타임에러가 발생해서 제출불가)

function solution(X, Y) {
    function hash(str){
        const count = new Map();
        [...str].forEach(char => {
            count.set(char, (count.get(char) || 0) + 1);
        });
        return count;
    }

    const hashX = hash(X);
    const hashY = hash(Y);
    let common = [];

    for (let [char, countX] of hashX) {
        if (hashY.has(char)) {
            let countY = hashY.get(char);
            common.push(...Array(Math.min(countX, countY)).fill(char));
        }
    }

    if (common.length === 0) {
        return "-1";
    }

    common.sort((a, b) => b - a);
    if (common[0] === '0') {
        return "0";
    }

    return common.join("");
}

답안

function solution(X, Y) {
  const hashX = new Map();
  const hashY = new Map();

  for (const digit of X) {
    hashX.set(digit, (hashX.get(digit) || 0) + 1);
  }
  for (const digit of Y) {
    hashY.set(digit, (hashY.get(digit) || 0) + 1);
  }

  let answer = '';
  for (let i = 9; i >= 0; i--) {
    const char = String(i);
    const count = Math.min(hashX.get(char), hashY.get(char));
    answer += char.repeat(count);
  }

  return answer ? (Number(answer) ? answer : '0') : '-1';
}