알림
본 포스팅은 공부 목적으로 작성된 글이며 상업적 목적으로 절대 사용되지 않았음을 밝힙니다.
문제
https://programmers.co.kr/learn/courses/30/lessons/42746
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.
0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.
코드
function solution(numbers) {
let string = numbers.map(a => a + ""); // 문자열로 변환
let answer = string.sort((a, b) => (b + a) - (a + b)).join(''); // 큰 수 정렬 및 배열 요소 연결
return answer[0] === '0' ? '0' : answer; // 방어 코드
}
풀이
주어지는 정수를 그냥 더하면 더하기가 되어버리기 때문에, 첫 번째로 주어지는 정수를 문자열로 변환해 주는 것이 첫 번째입니다.
두 번째로 sort() 함수로 정렬을 해야 하는데, 다음과 같이 사용할 수 있습니다.
// sort() 함수
let arr = [1, 3, 2, 5, 4];
arr.sort((a, b) => a - b) // 오름차순 1, 2, 3, 4, 5
arr.sort((a, b) => b - a) // 내림차순 5, 4, 3, 2, 1
따라서 큰 수를 앞에 세워 정렬해야 하기 때문에, 두 번째를 이용해 코드를 작성합니다. 하지만 저대로 작성하면 다음과 같이 출력이 되는데요.
테스트 1에서, 당연히 10이 가장 크고 그 다음이 6, 2이기 때문에, 1062가 출력이 됩니다. 하지만 저희는 숫자 하나하나를 비교해서 큰 숫자의 정렬이 아닌, 입력값들을 조합했을 때 커야 하기 때문에 다음과 같은 접근은 맞지 않고 다음과 같이 작성을 해 줘야 합니다.
이렇게 작성을 하면, 테스트 1로 예를 들 시, [6, 10, 2]에서 (b + a) - (a + b)는 106 - 610이 되기 때문에 음수가 되어 순서가 바뀌지 않지만, 다음 210 - 102에서는 양수가 되어 순서가 바뀌게 됩니다.
그렇게 하면 결론적으로 [6, 10, 2]는 [6, 2, 10]으로 순서가 바뀌었고, join() 함수를 통해 배열의 요소를 이어주면 됩니다.
참고로 join() 함수는 그대로 사용하게 되면 '6, 2, 10'으로 출력되기 때문에, join('')으로 작성해 줘야 () 안에 값('' = 공백)으로 이어줘 '6210'이란 값을 출력할 수 있게 됩니다.(만약 join('-')이면 당연히 '6-2-10'으로 출력됩니다.)
마지막에 리턴할 때 바로 answer가 아닌 조건문을 사용해준 이유는, 저대로 코드 작성 시, 테스트 케이스 11번에서 걸려 합격을 할 수가 없기 때문입니다.
테스트 케이스 11번의 경우 문제가 [0, 0, 0, 0]이기 때문에 답이 0000이 나오는데, 이럴 때는 0으로만 리턴해주면 되므로, 방어 코드를 작성하여 이런 경우에는 그냥 0이 리턴되게끔 작성해주면 됩니다.
'Algorithm > Programmers' 카테고리의 다른 글
[Programmers] 짝수와 홀수(JavaScript) (0) | 2022.05.04 |
---|---|
[Programmers] 같은 숫자는 싫어(JavaScript) (0) | 2022.05.03 |
[Programmers] 피보나치 수(JavaScript) (0) | 2022.04.30 |
[Programmers] 콜라츠 추측(JavaScript) (0) | 2022.04.29 |
[Programmers] 하샤드 수(JavaScript) (0) | 2022.04.28 |
댓글