[백준 | Javascript] 1181

박기영·2022년 8월 30일
0

백준

목록 보기
86/127
post-custom-banner

정렬. 9단계
1181. 단어 정렬

문제

1181번 문제 링크

solution 1

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보다 앞에 있는 것.

solution 2

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

profile
나를 믿는 사람들을, 실망시키지 않도록
post-custom-banner

0개의 댓글