https://school.programmers.co.kr/learn/courses/30/lessons/42746
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
풀이
function solution(numbers) {
const result = numbers
.map(String)
.sort((a, b) => (b + a).localeCompare(a + b))
.join('');
return result[0] === '0' ? '0' : result;
}
풀이는 정말 간단하고, 특히 sort 부분에는 정말 다양한 풀이가 있다.
하지만, 여기서는 localeCompare를 사용했는데, 그 이유는 다음과 같다.
기본적으로 sort() 메서드는 반환값이 음수, 0, 양수인지에 따라 정렬이 달라지게 된다.
우리가 보통 숫자 배열을 정렬할 때 다음과 같이 많이 사용한다.
numbers.sort((a, b) => a - b);
만약 numbers 배열이 [3,4,1,5,8] 라고 할 때, 결과는 [1,3,4,5,8]과 같이 오름차순으로 정렬된다.
첫 순회에서 3과 4를 비교해서 (3 - 4)를 하면 음수가 나오기 때문에 3이 4보다 작다고 판단해서 그대로 있게 된다.
그 다음 순회는 (4 - 1)을 해서 양수기 때문에 앞에 있는 4가 1보다 크다고 판단해서 자리가 바뀌게 된다.
기본적으로 sort() 메서드는 문자열 비교를 하기 때문에,
문자열 연산이 아니라 숫자 크기 비교를 위해서 뺄셈 연산으로 크기 비교를 해주는 것이다.
하지만, 이 문제는 숫자를 더하는 것이 아니라 '붙여서' 비교를 해야한다.
그래서 문자열로 모두 바꾼 뒤에, (앞 + 뒤)와 (뒤 + 앞)을 붙여서 비교를 해준다.
이때 단순히 '>'와 같은 부등호를 사용하게 되면 true나 false값이 나오기 때문에 제대로 된 비교가 안된다.
왜냐하면 sort는 양수, 음수로 정렬을 판단하기 때문이다.
따라서 `localeCompare()`를 사용하면 반환값이 음수, 0, 양수 중 하나이기 때문에 제대로 된 정렬이 가능하다.
'PS > Programmers' 카테고리의 다른 글
Programmers / Level 3 / 단속카메라 / JS (0) | 2025.09.12 |
---|---|
Programmers / Level 3 / 정수 삼각형 / JS (0) | 2025.09.10 |
Programmers / Level 2 / 양궁대회 / JS (0) | 2025.09.08 |
Programmers / Level 2 / 전력망을 둘로 나누기 / JS (0) | 2025.09.05 |