가장 큰 수. 정렬 문제이다. 정렬을 아직 확실히 이해하지 못하여서 어렵게 생각한다. 하지만 출제율이 상당이 높단다 ㅠㅠ
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.
예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.
0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요. 이다.
문제 를 풀기 위해서 생각해 보았다.
일단 같은 자리수를 비교한다음에 정렬을 해야 하고 만약 같은 자리수가 같다면 한번더 for문이나 map을돌려서 다시 비교를 해줘야 하고.. 상당히 머리가 아팠다.
그래서 비교해주는 함수를 만들기로 생각하였다.
큰 수를 저장해두고 큰 수와 그 큰 수를 뺀 나머지 배열을 리턴해주고
리턴 한 배열 값의 길이가 0일때까지 반복하는 것이었다.
하지만 이런 저런 문제들이 많이 발생하게 되어서 대략 1~2시간 정도 수정을 반복하다가 결국 힌트를 보기위해서 구글에 검색하게 되었다.
생각 보다 풀이는 간단했다.
function solution(numbers) {
var answer = numbers.map(v=>v+'')
.sort((a,b) => (b+a)1 - (a+b)1)
.join('');
return answer[0]==='0'?'0':answer;
}
map을 돌려서 일단 string값으로 변환 해준다. 그리고 배열의 앞뒤 문자들을
더한다 문자이기 때문에 10+10이 1010이 되기 때문에 비교가 된다.
하지만 저 방법이 정말 모든 것을 다확인할수 있는지 의문 이라는 생각이든다.
배열안에 값이 많을때 앞뒤 비교를 하고 정렬하고 앞뒤 비교를 하고 정렬하고 하는 일대일 로 비교 하는 방법인가 싶다.
그리고 정렬한것을 join을 통해서 더해준다.
그리고 방어 기법으로 앞자리 수가 0일때 0을 리턴해준다.
정말 쉽게 풀었다..
레벨 2단계에 진입했는데 확실히 어렵다.
빨리 코테 장인이 되고 싶다