문제 이해
이 문제는 주어진 숫자를 잘 조합해서 가장 큰 수를 만드는 문제이다. 그래서 기본적으로 내림차순 정렬을 해야하지만, 320과 32이 주어진 경우 32320이 32032보다 더 크다는 것에 유의해야 한다. 그래서 이 문제는 sorting을 조금 더 효율적으로 다룰 수 있는지 확인할 수 있는 문제인 것 같다.
먼저 내 첫 풀이는 맞는 풀이인 것 같지만 너무 시간이 오래 걸려서 시간 초과로 실패했다. 그래서 다른 사람 코드를 참고했다. 다른 분들 풀이를 보니 아이디어가 대단해보였다. ㅜ
방법 1
이 방법은 위에 유의할 점을 그대로 적용한 코드이다. 문자열로 변환하고, 문자열의 순서를 비교하는 코드라서 시간이 굉장히 오래 걸린다는 단점이 있다.
맨 처음에 while문으로 뒤에 따라오는 0을 제거하고 크기가 같으면 `b - a`로 내림차 순 정렬했고, 만약 0을 제거한 후에도 다른 숫자라면 문자열 순으로 내림차 순 정렬하도록 했다.
function solution(numbers) {
numbers.sort((a, b) => {
let [tmpA, tmpB] = [a, b];
while (tmpA % 10 === 0 && tmpA !== 0) {
tmpA /= 10;
}
while (tmpB % 10 === 0 && tmpB !== 0) {
tmpB /= 10;
}
console.log(tmpA, tmpB);
if (tmpA === tmpB) {
console.log(tmpA, tmpB);
return b - a;
} else {
return a.toString().localeCompare(b.toString());
}
});
console.log(numbers.reverse().join(''));
const answer = numbers.reverse().join('');
if (answer[0] === '0') {
return '0'
}
return answer;
}
방법 2
다른 사람이 올린 파이썬 코드를 JS로 바꾸었다. 이 문제는 `numbers`의 원소가 0과 1000 사이에 있다는 것을 고려해서 만든 풀이이다.
주어진 숫자를 문자열로 바꾸어 4번 반복한 후 앞 4자리의 크기를 비교해 그 기준으로 내림차순 정렬하는 방법이다. 이렇게 하면 끝자리에 0이 들어간 숫자도 길이로 판별할 수 있다.
function solution(numbers) {
const tmp = numbers.map((num,i) => [num.toString().repeat(4).slice(0,4),i])
tmp.sort()
const answer = tmp.reverse().map(arr => numbers[arr[1]]).join('');
if (answer[0] === '0') {
return '0'
}
return answer;
}
`tmp`는 2차원 배열인데 `sort()`를 하면 첫번째 원소를 기준으로 정렬해준다. 중간에 `console.log(tmp)`를 추가해서 확인해보면 알 수 있다.
방법 3
이 방법을 보고 기발하다고 생각했다. 비교하는 두 숫자를 앞뒤로 이어붙인 후 크기를 비교해 전체 배열을 내림차순 배열하는 방법이다.
function solution(numbers) {
let answer = numbers.map(v=>v+'')
.sort((a,b) => (b+a)*1 - (a+b)*1)
answer = answer.join('');
return answer[0]==='0'?'0':answer;
}
const n = [3, 30, 34, 5, 9, 0];
console.log(solution(n));
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[JS] 큰 수 만들기 (1) | 2024.10.09 |
---|---|
[JS] 숫자 변환하기 (+DFS, BFS, DP) (0) | 2024.09.27 |
[JS] 피로도 (0) | 2024.09.19 |
[JS] 의상 (+ 배열 `reduce` 메소드) (0) | 2024.09.12 |
[JS] 괄호 회전하기 (0) | 2024.09.06 |