본문 바로가기

CS/알고리즘&문제풀이

[프로그래머스] 숫자짝꿍

https://school.programmers.co.kr/learn/courses/30/lessons/131128

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 각 숫자 문자열을 받아 만들 수 있는 가장 큰 숫자를 문자열로 반환하는 문제다. 처음에는 각 문자열을 나누어 정렬한 후 서로 같은 문자를 비교하는 방식으로 문제를 해결했다.

function solution(X, Y) {
    const xsp = X.split('').map(it => Number(it)).sort((a,b) => b-a);
    const ysp = Y.split('').map(it => Number(it)).sort((a,b) => b-a);
    
    let xc = 0, yc = 0;
    let result = "";
    while(xc<xsp.length && yc< ysp.length) {
        if(xsp[xc] === ysp[yc]) {
               result += (xsp[xc]).toString();
            xc++; yc++;
        } else if (xsp[xc] < ysp[yc]) {
            yc++;
        } else {
            xc++;
        }
    }
    if(result && result[0] === '0') result = '0';
    return result.length > 0? result : '-1';
}

 문제가 해결되기는 했는데, 특정 테스트케이스에 대해 복잡도가 너무 높게 나왔다.

이렇게 문제를 풀면 딱히 의미가 없기 때문에 다른 사람의 풀이 방식을 봤는데, X 및 Y에 대해 각각  숫자 개수를 구하고, 해당 개수를 이용해서 조작하는 풀이 방식을 사용하고 있었다. 그래서 나도 Map을 이용하여 해당 문제를 동일한 방식으로 풀어보기로 했다.

function solution(X, Y) {
    const xmap = new Map();
    const ymap = new Map();
    
    for(const ch of X) {
        xmap.set(ch, (xmap.get(ch) ?? 0) + 1);
    }
    for(const ch of Y) {
        ymap.set(ch, (ymap.get(ch) ?? 0) + 1);
    }
    
    const map = 0;
    let result = "";
    for(let i = 9; i >= 0; i--) {
        const x = xmap.get(`${i}`);
        const y = ymap.get(`${i}`);
        // console.log(x,y);
        if(x && y) {
            result += `${i}`.repeat(Math.min(x,y));
        }
    }
    if(result && result[0] === '0') {
        result = '0';
    }
    
    return result.length > 0 ? result : "-1";
}

실행 시간이 많이 줄었다. 앞의 풀이는 배열을 만들고 정렬하는 과정 + 비교 연산이 있어서 복잡했는데, 후자의 경우 이런 과정이 거의 없어서 빨리 동작한 것 같다. 좀더 고민하면서 문제를 풀어봐야겠다.