[Javascript] 프로그래머스 Level1 _ 문자열 내림차순으로 배치하기
👇🏻
👇🏻
시행착오
( + 코드를 작성하면서 든 생각들.)
1.
예제는 이미 정렬된 상태이기 때문에 //주석 처리된 코드로 실행해도 통과가 된다.
하지만 다른 테스트 케이스들처럼 정렬이 되지 않은 상태라면 틀린 코드가 된다!
그렇기 때문에 먼저 정렬을 하고 .reverse()를 통해 역순으로 정렬을 한 뒤에 합쳐줘야 한다.
function solution(s) {
//return s.split('').revers().join('');
return s.split('').sort().reverse().join('');
}
+)
보통 우리는 역순으로 숫자를 정렬할 때 sort()에 ((a,b) => b-a ); 함수식을 파라미터로 전달해서 정렬했다.
여기서도 이렇게 사용하면 뒤집어져서 배열이 정렬될 거라고 생각했지만 출력해보면 그렇지 않았다.
왜 그런지 확인해보자!
function solution(s) {
return s.split('').sort().join('');
// "Zbcdefg"
return s.split('').sort((a,b) => b-a).join('');
// "Zbcdefg" => "bcdefgZ"가 나와야하는 것 아닌가 ? ㅠㅠ
}
sort()는 compareFunction을 생략한다면
기본적으로 👇🏼 유니코드 코드 포인트를 기준으로 오름차순으로 정렬한다.
A | Z | a | z |
U+0041 | U+005A | U+0061 | U+007A |
유니코드 코드 포인트는 A < Z < a < z 순으로 증가한다. (즉, 대문자가 소문자보다 작다고 판단)
예제를 통해 확인해보면,
str.sort() | 오름차순 | ["A", "B", "C", "D", "a", "b", "c", "d"] |
str.sort((a,b) => b-a); | 내림차순 | ["a", "b", "c", "d", "A", "B", "C", "D"] |
대문자는 대문자대로 소문자는 소문자대로 정렬 한 것을
[ 대문자 정렬 ] [ 소문자 정렬 ]
[ 소문자 정렬 ] [ 대문자 정렬 ] 으로 정렬해서 리턴한다.
내림차순의 결괏값을 살펴보면 d가 A보다 크고, D가 A보다 큰데도 말이다.
그래서 정렬된 배열의 순서를 기준으로 그대로 뒤집고 싶다면 reverse()를 사용하는게 좋다.
a | b | c | d | A | B | C | D |
U+0061 | U+0062 | U+0063 | U+0064 | U+0041 | U+0042 | U+0043 | U+0044 |
그렇다면 A 직전의 유니코드 코드 포인트 U+0040은 무엇일까?
정답 : "@"이다!
[참고] 어딘가 이상한 자바스크립트 문자열 배열 정렬 이야기
⚠️ 아래 내용은 모두 개인적인 참고 / 기록을 위한 용도입니다. 참고해주시고 편안하게 봐주세요 :) ⚠️
*** 혹시라도 잘못된 정보가 있다면 언제든지 알려주시면 감사하겠습니다 ! ***
'Programmers > Level 1' 카테고리의 다른 글
[Javascript] 프로그래머스 : 정수 제곱근 판별 (0) | 2021.07.06 |
---|---|
[Javascript] 프로그래머스 : 두 정수 사이의 합 (0) | 2021.07.06 |
[Javascript] 프로그래머스 : K번째수 (0) | 2021.07.04 |
[Javascript] 프로그래머스 : 문자열 내 p와 y의 개수 (0) | 2021.07.03 |
[Javascript] 프로그래머스 : 문자열을 정수로 바꾸기 (0) | 2021.07.03 |