https://programmers.co.kr/learn/courses/30/lessons/42746
가장 큰 수
문제 설명
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" |
수도 코드
1.첫번째 자리를 비교한다. 큰걸 앞으로 간다.
2.같은 게 있으면 두번째 자리를 비교해서 큰게 앞으로 간다. + 두번째자리가 첫번째 자리보다 작으면 뒤로 간다.
3.다 조인으로 뭉치면 끝
이라고 생각했다.
처음 문제풀이
function solution(numbers) {
let arr = numbers.sort().reverse().map(el => String(el));
let sortArr = [];
for (let i = 0; i<arr.length; i++) {
let length = arr[i].length
if (length === 1) {
for (let j = 0; j<sortArr.length; j++) {
if(arr[i] > sortArr[j][1]) {
let newArr = [...sortArr.slice(0,j),arr[i],...sortArr.slice(j)]
sortArr = newArr
}
}
}
else {
sortArr.push(arr[i])
}
}
return sortArr.join("")
}
계획은 먼저 sort를 시키고 reverse 시킨 뒤 문자열로 바꾼 배열에서 한자리수의 위치만을 바꿔주는 것이었다.
문제가 되는 사항은 한자리 수의 위치를 어떻게 지정할 것인가에 대한 것이었고 두번째로 무한히 돌아가는 코드였다.
let newArr = [...sortArr.slice(0,j),arr[i],...sortArr.slice(j)]
sortArr = newArr
이 부분이었고 결국 문제를 다 지우고 다른 방법을 풀어보기 위해 노력했지만 문제를 풀지 못했다.
정답
function solution(numbers) {
var answer = numbers.map(c=> c + '').
sort((a,b) => (b+a) - (a+b)).join('');
return answer[0]==='0'? '0' : answer;
}
이걸보고 sort 내장함수를 정확하게 사용할줄 모른다는 것을 깨달았다. 그래서 sort의 구현방법에 대해서 찾아보게됐다.
Javascript Sort함수에 대한 잡지식
그동안 나는 sort를 ((a,b) => a-b) 오름차순만을 사용했었는데 그 구현이 어떻게 되는건지 전혀 이해하지 못하고 있었다.
위의 블로그에서 나온 방법에 대한 내용은 MDN에서 보던것보다 쉬운 예시로 설명되어있었는데
[1,2,3,4,5]
의 배열을 sort 할 때 a,b가 각각 [2,3,4,5], [1,2,3,4]
였단걸 깨달았다.
전까진 그냥 사용만 했는데 a,b의 역할이 내가 알던것과 정반대여서 놀라게 되면서 한편으로 앞으로 sort를 더 잘 활용할 수 있을것 같았다.