https://school.programmers.co.kr/learn/courses/30/lessons/131128
각 숫자 문자열을 받아 만들 수 있는 가장 큰 숫자를 문자열로 반환하는 문제다. 처음에는 각 문자열을 나누어 정렬한 후 서로 같은 문자를 비교하는 방식으로 문제를 해결했다.
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";
}
실행 시간이 많이 줄었다. 앞의 풀이는 배열을 만들고 정렬하는 과정 + 비교 연산이 있어서 복잡했는데, 후자의 경우 이런 과정이 거의 없어서 빨리 동작한 것 같다. 좀더 고민하면서 문제를 풀어봐야겠다.
'CS > 알고리즘&문제풀이' 카테고리의 다른 글
[백준] 계단 오르기 (0) | 2023.04.08 |
---|---|
[프로그래머스] 조이스틱 (0) | 2023.04.02 |
[프로그래머스] 이진수 더하기 (0) | 2023.03.18 |
[프로그래머스] 당구 연습 (0) | 2023.03.17 |
[프로그래머스] 베스트 앨범 (0) | 2023.03.14 |