두 정수가 주어질 때 공통으로 들어간 수로 만들 수 있는 가장 큰 정수를 리턴하는 문제이다.
공통을 비교할 때 짝꿍의 형태로 같다면 양쪽에서 지워지는 형식이다.
먼저 작성한 코드
function solution(X, Y) {
var answer = '';
let sortX = X.split('').sort((a,b) => b-a).join('')
let sortY = Y.split('').sort((a,b) => b-a).join('')
let max = Math.max(sortX, sortY)+''
let min = Math.min(sortX, sortY)+''
do {
if (min.length===0 || max.length === 0) {
break;
}
let targetIndex = max.indexOf(min[0])
if (targetIndex<0) {
min = min.replace(min[0], '')
continue;
}
if (targetIndex>=0) {
if (min[0] == 0) {
answer+= '0'
break;
}
answer += min[0]
max = max.slice(targetIndex+1, max.length)
min = min.replace(min[0], '')
}
} while(answer.length <= min.length)
return answer ? answer : '-1';
}
먼저 들어오는 두 수를 배열화시키고, 내림차순으로 정렬하고 다시 합쳤다.
그리고 두가지 중 더 큰 것과 더 작은 것을 나누어 문자열화 시켰다.
그 후 do while을 이용하여 비교 및 추가를 진행하였다.
더 작은 값의 0번 인덱스를 기준으로 잡고 max에 해당 수가 포함되어있는지 파악한다.
포함되어있지 않다면, min의 0번 인덱스 값을 삭제하고 다음 반복으로 넘어간다.
만약 포함되어있다면, 그 값이 0인지부터 판별한다. 내림차순으로 정렬되어있기 때문에 0이후의 값은 모두 0이므로
정답에 0을 붙여주고 반복을 완전히 끝내는 형식이다.
테스트는 전부 통과했으나 실제 코드실행에서 실패하였다.
두번째로 작성한 코드
function solution(X, Y) {
var answer = '';
X = X.split('')
Y = Y.split('')
for (let i = 0; i<10; i++) {
let x_num = X.filter((x) => x==i).length;
let y_num = Y.filter((y) => y==i).length;
let min = x_num>y_num ? y_num : x_num
answer += i.toString().repeat(min)
}
if (answer=='') return '-1';
if (answer==0) return '0';
return answer.split('').sort((a,b) => b-a).join('');
}
들어오는 두 수를 분리하여 배열화시키고 반복문에서 0~9까지 각 배열의 요소를 판별한다.
i에 해당하는 정수가 각 배열에 몇개가 있는지 판단하고 둘 중 작은 개수를 판별하여
answer에 해당 i가 min만큼 반복되도록하여 추가한다.
반복문으로 0~9까지 추가가 완료된 후 먼저 빈문자열인지 판단하여 -1을 리턴하고, 0인경우 0을 리턴한다.
둘 다 아닐경우 answer을 배열>내림차순>문자열화 시켜 리턴한다.