정렬. 9단계
1181. 단어 정렬
const fs = require("fs");
let input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");
const iter = input.shift();
// 중복되는 값을 제거하는 Set 객체(new Set)
// Set 객체를 배열 형태로 전환(Array.from)
let arr = Array.from(new Set(input));
// a와 b의 길이를 비교해서 짧은게 먼저 오게 정렬
// 만약, 길이가 같다면 0이 되므로, localeCompare 실행
// localeCompare는 사전순으로 정렬되게 만들어줌
arr.sort((a, b) => a.length - b.length || a.localeCompare(b));
console.log(arr.join("\n"));
다른건 정렬 문제에서 흔히 마주했던 것들인데, localeCompare라는 것은 생소하다.
localeCompare는 문자열끼리 비교를 해주는 함수이다. 사용법은 아래와 같다.
referenceStr.localeCompare(compareString);
예시를 살펴보자.
let a = "a";
let b = "b";
let c = "c";
a.localeCompare(a); // 0
a.localeCompare(b); // -1
a.localeCompare(c); // -2
b.localeCompare(c); // -1
b.localeCompare(a); // 1
c.localeCompare(a); // 2
출력되는 숫자들이 알파벳 간격이라고 생각할 수 있는데,
MDN docs에 따르면 이는 그저 브라우저마다 다르게 출력되는 것으로, -1,0,1만 나오는 것이 아닐 수 있다는 것에 주의를 당부하고 있다.
따라서, 정리하면 다음과 같다.
0이 나오면 두 문자열이 같은 것.
음수가 나오면 referenceStr가 compareString보다 앞에 있는 것.
양수가 나오면 compareString가 referenceStr보다 앞에 있는 것.
const fs = require("fs");
let input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");
const iter = input.shift();
// 중복되는 값을 제거하는 Set 객체(new Set)
// Set 객체를 배열 형태로 전환(Array.from)
let arr = Array.from(new Set(input));
// 사전 순서로 정렬
arr.sort((a, b) => a > b ? 1 : (a < b ? -1 : 0));
// 길이 순서로 정렬
arr.sort((a,b) => a.length - b.length);
console.log(arr.join("\n"));
이 것은 다른 풀이법을 찾던 중 발견한 다른 분의 풀이이다.
필자는 길이 순서 -> 사전 순서로 코드를 만들었기 때문에, 위 코드의 두 비교 순서를 바꿔서 해봤는데...
바꾸면 오답이 된다. 이 부분은 아무리 생각해봐도 이유를 모르겠다..
다른건 이해가 되는데 사전 순서로 정렬하는 부분이 조금 이해가 안되서 if문으로 변환해보려고한다.
arr.sort((a, b) => a > b ? 1 : (a < b ? -1 : 0));
// 위 코드와 동일
arr.sort((a, b) => {
if(a > b){
return 1;
} else if(a < b) {
return -1;
} else {
return 0;
}
});
a > b가 true라면 a가 사전 순서로 더 뒤에 있는 것이기 때문에 1을 return. 정렬됨.
a < b가 true라면 a가 사전 순서로 더 앞에 있는 것이기 때문에 -1을 return. 변화 x.
a === b가 true라면 사전 순서가 같으므로 0을 return. 변화 x.
일반적인 오름차순 정렬을 삼항연산자로 간단하게 작성하신 것 같다.
그런데, 문자열에 대해 오름차순 정렬을 할 때는 sort() 내부를 작성하지 않아도 된다.
따라서, 위 코드는
arr.sort();
라고만 해도, 문제없이 작동한다.
참고 자료 1
참고 자료 2
참고 자료 3
참고 자료 4
참고 자료 5
참고 자료 6
localeCompare() MDN 공식 docs