문제 링크
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
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;
}
'알고리즘' 카테고리의 다른 글
[프로그래머스] 뒤에 있는 큰 수 찾기 JavaScript (0) | 2023.01.27 |
---|---|
[프로그래머스] 최빈값 구하기 JavaScript (0) | 2022.10.20 |
[프로그래머스] 두 큐 합 같게 만들기 JavaScript (1) | 2022.09.26 |
[프로그래머스] 게임 맵 최단거리 JavaScript (0) | 2022.08.26 |
[프로그래머스] 타겟 넘버 JavaScript (0) | 2022.08.23 |