카테고리 없음

[프로그래머스 level 1] 숫자 짝꿍 - 131128

nh_3521099031483 2024. 4. 4. 16:51

문제 설명

두 정수 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합니다.
function solution(X, Y) {
    var answer = [];
    let xarr = new Array(10).fill(0); // 각 숫자의 개수를 저장할 배열 초기화
    let yarr = new Array(10).fill(0); // 각 숫자의 개수를 저장할 배열 초기화

    X = X.split(''); // X를 문자 배열로 분리
    Y = Y.split(''); // Y를 문자 배열로 분리

    // X와 Y에서 각 숫자의 개수를 세는 과정
    for (let i = 0; i < X.length; i++) {
        xarr[X[i]] += 1;
    }
    for (let i = 0; i < Y.length; i++) {
        yarr[Y[i]] += 1;
    }

    // 각 숫자별로 두 수에서 공통으로 나타나는 숫자를 찾아 큰 순서대로 결과를 구성
    for(let i = 9; i >= 0; i--) {
        if (xarr[i] !== 0 && yarr[i] !== 0) {
            let minCount = Math.min(xarr[i], yarr[i]); // X와 Y에서 공통으로 나타나는 수의 최소 개수 찾기

            // 최소 개수만큼 해당 숫자를 결과에 추가
            answer.push(String(i).repeat(minCount));
        }
    }

    // 결과를 문자열로 변환
    answer = answer.join('');

    // 결과가 없는 경우와 0으로만 이루어진 경우를 처리
    if(answer == '') return '-1';
    if(answer[0] == '0') return '0';

    return answer;
}

 

이중 for문으로 풀다가 시간초과가 나왔다. 전혀 감이 안잡혔다. gpt의 도움도 받아보고 다른 사람 풀이도 보면서 이해했다.

reduce를 사용해서 객체로 만들어 푸는 법도 있었는데 되게 인상깊었다.