2차 공부/알고리즘

숫자짝꿍

공대탈출 2024. 6. 18. 16:40

두 정수가 주어질 때 공통으로 들어간 수로 만들 수 있는 가장 큰 정수를 리턴하는 문제이다.

공통을 비교할 때 짝꿍의 형태로 같다면 양쪽에서 지워지는 형식이다.


 

먼저 작성한 코드

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을 배열>내림차순>문자열화 시켜 리턴한다.

'2차 공부 > 알고리즘' 카테고리의 다른 글

대충 만든 자판  (1) 2024.06.21
체육복  (0) 2024.06.19
옹알이(2)  (0) 2024.06.17
24.06.13 기사단원의 무기  (0) 2024.06.13
소수 만들기  (0) 2024.06.12