알고리즘

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

sandwe 2022. 10. 8. 01:45

문제 링크

 

프로그래머스

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

programmers.co.kr

 

문제 유형

문자열, Map

 

문제 풀이

이번 문제는 문자열 타입의 두 숫자가 주어지고, 공통으로 나타나는 정수들을 이용하여 만들 수 있는 가장 큰 숫자를 반환하는 문제이다. 처음에 생각한 문제 접근법은 다음과 같다.

1. 숫자 X의 맵을 만들고, 각 자리에 해당하는 숫자가 나온 횟수를 저장한다.

2. 숫자 Y를 순회하면서 각 자리에 해당하는 숫자가 X에 있으면 공통으로 나타나는 숫자임을 확인하고 따로 저장한다.

3. '000'과 같은 수는 '0'을, 공통 수가 없으면 -1을, 그 이외의 수는 내림차순으로 정렬시켜 만든 문자열을 반환하도록 한다.

 

문제를 풀면서 '000'과 같은 문자열을 만나면 '0'으로 바꿔주기 위한 코드를 작성하는 것에서 어려움을 겪었다. 좋은 방법이 있을 것 같았는데 Set을 생성해 중복된 값을 제거하는 방법 밖에 떠오르지 않았다.


문제를 풀고 난뒤 다른 사람의 풀이 중 +를 붙여 숫자로 암묵적 형변환을 하는 것을 보았고, 이를 이용하면 좀더 깔끔하게 코드를 작성할 수 있을 것 같았다. 단, 이때는 원래 작성했던 조건문의 순서와 다르게 공통된 숫자가 하나도 없는 경우, 즉 str이 빈 문자열인 경우를 먼저 비교해줘야 한다. 빈 문자열("")을 숫자로 형변환 시 0이 되고 만약 0인지를 비교하는 조건문이 가장 먼저 나온다면 이 경우도 해당되기 때문에 잘못된 값이 출력되기 때문이다.

 

코드

function solution(X, Y) {
    const mapX = new Map();
    let str = "";

    for (const num of X) {
        mapX.set(num, mapX.get(num) + 1 || 1);
    }

    for (const num of Y) {
        if (mapX.has(num) && mapX.get(num) > 0) {
            str += num;
            mapX.set(num, mapX.get(num) - 1);
        }
    }


    if ([...new Set(str)][0] === "0") str = '0';
    else if (!str) str = "-1";
    else str = str.split("").sort((a, b) => b - a).join("");
    return  str;
}
function solution(X, Y) {
    const mapX = new Map();
    let str = "";
    
    for (const num of X) {
        mapX.set(num, mapX.get(num) + 1 || 1);
    }
    
    for (const num of Y) {
        if (mapX.has(num) && mapX.get(num) > 0) {
            str += num;
            mapX.set(num, mapX.get(num) - 1);
        }
    }
    
    if (!str) str = "-1";
    else if (+str === 0) str = "0";
    else str = str.split("").sort((a, b) => b - a).join("");
    return  str;
}