카테고리 없음
[프로그래머스 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를 사용해서 객체로 만들어 푸는 법도 있었는데 되게 인상깊었다.