프로그래머스 (JS)/Lv. 1
[Programmers / JS] 131128번 - 숫자짝꿍
hodo-
2023. 3. 27. 20:57
Problem
두 정수 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 함수를 완성해주세요.
Solution
문제분석
X, Y 겹치지 않는다면 return -1
X, Y 겹치는 것이 0만 있다면 return 0
숫자는 0 ~ 9까지로 이루어져있다.
return X, Y 겹치는 수를 조합해서 만들 수 있는 가장 큰 수
문제풀이
1. X, Y 각각 배열로 만들어준다.
2. 숫자가 한정적이므로 for문으로 X, Y 각각 0 ~ 9까지 해당하는 숫자개수를 찾아낸다
3. X, Y 둘이 겹치는 수만 뽑으므로 X, Y 중 가장 작은 개수를 뽑아서 해당 숫자를 가장 작은 개수만큼 곱한 값을 answer에 넣어준다
4. answer에 아무것도 없다면(X, Y 겹치는 것이 없음) return -1
5. answer에 0밖에 없을 경우 return 0
6. 4, 5에 해당하지 않는다면 answer를 오름차순으로 만들어준다.
function solution(X, Y) {
let answer = "";
X = [...X];
Y = [...Y];
for(let i = 0; i < 10; i++){
const x = X.filter(x => Number(x) === i).length;
const y = Y.filter(y => Number(y) === i).length;
answer += String(i).repeat(Math.min(x, y));
}
if(answer === "") return "-1";
if(Number(answer) === 0) return "0";
return [...answer].sort((a, b) => b - a, 0).join('');
}

지금 풀이를 작성하다가 떠오른 코드가 있다.
function solution(X, Y) {
let answer = "";
X = [...X];
Y = [...Y];
for(let i = 9; i >= 0; i--){
const x = X.filter(x => Number(x) === i).length;
const y = Y.filter(y => Number(y) === i).length;
answer += String(i).repeat(Math.min(x, y));
}
if(answer === "") return "-1";
if(Number(answer) === 0) return "0";
return [...answer].join('');
}
for문을 숫자가 큰 것부터 해준다면 return 때 굳이 오름차순을 해주지 않아도 된다!
(answer에 큰 수대로 차례대로 넣어지기 때문!)
직접 실행해보니 시간복잡도도 줄어들었다 ^_^bb