2026.4.17. & 2026.4.18.
https://school.programmers.co.kr/learn/courses/30/lessons/42746
sort()로는 엣지케이스가 존재하는 상황에서 직접 정렬 로직 구현하기sort()에 커스텀 콜백을 넘기는데, 문자열로 만들어 비교하는 방법을 선택했음sort((a, b) => b - a) 이렇게 많이 쓰다보니, 콜백에서 비교하고 a : b 를 리턴하게 했는데, 그렇게 하면 정확한 정렬이 안됨! 왜? sort는 콜백 반환값이 음수/양수/0 중 무엇인지만 판단하기 때문임. 3과 30을 비교해서 30을 리턴하든 3을 리턴하든 똑같이 양수이므로 (a, b) 중 b가 앞에 배치된다. 문제에서 주어지는 배열은 0 또는 양의 정수로 구성되므로 결국 어떤 경우든 항상 0 또는 양수를 리턴하니 정렬이 제대로 안되는 것이다~~!! => 명확하게 음수/양수/0 케이스로 구별하여 리턴해야 한다.function solution(numbers) {
if (numbers.every(n => n === 0)) return '0';
const answer = [...numbers].sort((a, b) => `${a}${b}` < `${b}${a}` ? 1 : -1);
return answer.join('');
}
function solution(numbers) {
const answer = [...numbers].sort((a, b) => `${a}${b}` < `${b}${a}` ? 1 : -1).join('');
return answer[0] === '0' ? '0' : answer;
}
배열의 모든 요소가 0인 경우를 체크하는 방법의 차이
sort 연산을 하지 않는 게 더 효율적이지 않을까? 하며 얼리 리턴을 고집해봤다. 대신 모든 요소를 순회하지 않게, some()으로 변경하고, 0이 아닌 요소가 하나라도 발견되면 기존대로 answer을 구하는 연산을 수행하게 하고, 아니면 0을 리턴하게도 작성해봤다.비교 결과
A. [얼리 리턴] every를 사용한 경우 - 전반적인 연산 속도가 가장 오래 걸림.
B. some을 사용해 조건을 체크한 경우 - 모든 요소가 0인 케이스 연산만 C보다 0.02ms 빠르고, 그 외의 속도는 C가 근소하게 빠름.
C. 조건 없이 코드를 실행하고, 마지막에 제일 첫 요소가 '0'인지 체크한 경우 - 전반적으로 가장 빠름!
왜 이런 결과가 나왔는지 생각해봤다.
얼리 리턴, 조건 체크를 추가하면, 어떤 인풋이 들어오든 if문을 한번 실행한다. 그것을 만족하는 케이스가 많다면 더 효율적일 수도 있다. 그러나 이번 문제에서는 11번 테스트 케이스를 제외하고는 그런 경우가 없다.
이 접근법은 (every를 쓰든 some을 쓰든), 한가지 경우를 위해 모든 다른 경우에 불필요한 if문과 비교 연산이 실행되는 것이다. => 오히려 이것이 비효율!
정렬 연산 수행 후 그 문자열의 제일 앞 요소가 '0'과 같은지 비교하는 것이 오히려 가벼운 것인가보다.
sort의 콜백으로 넘기자. 까지는 그래도 금방 생각해냈는데, 거기서 콜백이 리턴하는 값을 1, -1이 아닌 그 숫자 자체로 작성하는 바람에 오답을.."b" - "a" 이런 것도 적어봤음. 참고로 저걸 실행하면 NaN임..sort 콜백 구성할 때, 서로 같은 값이면 0을 리턴하게 3가지로 나누어 작성했던 기억이 나서 그것도 추가해봄. 그러다가 아, 비교 후 1, -1을 리턴해서 정렬이 이루어지도록 해야하지? 떠올랐다.numbers = [0, 0, 0] 일 때 이 코드의 결과는 무엇인가?localeCompare (그냥 compare는 존재하지 않음)join('')하면 배열의 모든 요소를 빈 문자열로 연결해 하나의 문자열이 구성됨sort의 콜백을 구성할 때는 -1, 0, 1을 일관되게 리턴하게 하자. sort는 콜백 반환값이 음수인지 양수인지 0인지만 판단하기 때문!!모든 요소가 0 같은 경우도 의심해보자.