문제 설명
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.
예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.
0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.
제한 사항
- numbers의 길이는 1 이상 100,000 이하입니다.
- numbers의 원소는 0 이상 1,000 이하입니다.
- 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.
입출력 예
numbers / return
[6, 10, 2] | "6210" |
[3, 30, 34, 5, 9] | "9534330" |
작성한 코드 (다른사람 코드 참조)
function solution(numbers) {
const answer = numbers.map(c => String(c)) // 원소를 string 으로 만든다.
.sort((a,b) => (b+a) - (a+b)) // 비교하는 두 수(String)를 오름차순정렬
.join(""); // 문자열로 합친다.
return answer[0] === "0" ? "0" : answer; // numbers의 모든 원소가 0일경우, retunn "0"
}
가장 좋아보이기만 했던 다른사람의 코드 (*그러나, 따라하면 안됨)
function solution(numbers) {
let answer = numbers.sort((a, b) => `${b}${a}` - `${a}${b}`).join('');
return answer[0] === '0' ? '0' : answer;
}
배운점
보기에는 쉬워보이는 문제였다. 간단한데? 싶었다. numbers의 value의 앞자리만 비교해서 정렬해주면 되지 않을까? 싶었다. 그리고, numbers의 원소들을 각각 비교해서 처리하는 방식을 사용하면 되겠다 싶었다. 근데, 뭔가 미친짓 같았다.
나는 sort 함수에 대해 의구심이 매번 든다. 알고리즘이 정확히 어떻게 도는지 정확히 감이 안오기 때문이다.
그래서 가끔씩 sort 함수 내에서 a,b를 console로 가끔 찍어본다. 그리고, 또 다시한번씩 계속 머리 속에 박아넣고 있다. 하나씩 비교해서 뒤집고 뒤집는 것임대로 불구하고 매번 그런다. 그러나보니, 간신히 이해할 수 있었던 것 같다.
이 문제 자체가 코딩테스트를 위한 문제같다. 이런 것은 바로 해답을 보는 것이 정신건강에 좋다는 것을 알고 있다. 코딩테스트는 빠르게 공식에 익숙해지는 것이 아닐까 싶다.
+그래도 다른 사람의 코드를 보고 Template Literals 을 사용해서 map을 한번 안돌리는 것은 매우 좋은 방식이라고 생각을 했었다. 배열 내 원소들의 Type을 꼭 바꿀필요는 없을 수도 있겠다 싶었다....하지만, 테스트 측정 결과는 더 느렸다.
아마도, sort 할 때 마다 문자열로 바꿔서 비교하고, 또 바꿔서 비교하고 그렇기 때문이 아닐까 싶다. 이러면, 전체 원소 수 보다 더 많이 type을 변환하게 될 것이다. 그 게 속도 차이를 만든 것으로 추정된다.
작성했던 코드처럼,
바로 읽기 편하게 작성하는게
거의 대부분의 상황에
항상 가장 좋지 않나 싶다.
'Javascript' 카테고리의 다른 글
[javascript] async / await 짧은 정리 (0) | 2022.01.07 |
---|---|
[코딩테스트/해시] 위장 by Programmers (0) | 2021.11.12 |
[코딩테스트/정렬] H-index by Programmers (0) | 2021.11.04 |
[코딩테스트/탐욕법(Greedy)] 체육복 by Programmers (0) | 2021.10.30 |
[코딩테스트] 주로 사용하는 원리 정리 (0) | 2021.10.28 |
[코딩테스트/정렬] K번째수 by Programmers (0) | 2021.10.28 |
[코딩테스트/해시] 완주하지 못한 선수 by Programmers (0) | 2021.10.26 |
댓글