본문 바로가기
Algorithm

99클럽 코테 스터디 13일차 TIL - 단어 정렬(백준 1181 / JavaScript)

by 륜곰 2025. 4. 17.

오늘의 문제 링크

 

⭐ intro : 문제를 생각해나간 방식

 단어들 목록에서 중복값을 제거하고, 그 중복이 제거된 값을 이용해서 정렬하는 문제였다. Set() 자료구조를 얼추 익혔던 지라 이제 중복제거 문제는 저절로 손에 손이 가는듯 하다. sort 정렬 구문에 따로 콜백함수가 들어갈 수 있었다는 사실을 이제 알았고... (항상 단일로만 써서 숫자만 정렬했던 나 자신에 반성...) sort가 돌아가는 방식에 있어서 한번 더 공부해 볼 수 있었다. 생각보다 간단하게 풀 수 있었다. 특히 localeCompare()를 잘 몰라서 되게 해멨었다...

 

⭐ 풀이과정

 앞선 문제와 마찬가지로 배열 구문의 input값들을 배열 구조분해 할당으로 분리해주고, 런타임에러가 발생하지 않도록 주어진 조건 갯수만 반복하도록 배열 길이도 적절하게 최대값을 지정해둔 상태에서 해당 값들을 받는다. 그리고 sortWord라는 set 자료형을 만들어서 집어넣는다

const [length, ...rest] = input;
const N = parseInt(length, 10);
const arr = rest.slice(0, N);

function solution(N, arr) {
  let sortWord = new Set();
  for (let word of arr) {
    sortWord.add(word[0]);
  }
}

 set 자료구조를 이용할때 항상 이중배열로 뱉어져서 뭔가 좀 불필요하게 [ ]가 들어가는 느낌인데, 일단 지금은 푸는것에 목표를 맞추는 것으로 잡아야 겠다.  

 

 다음으로 Set 자료형을 Array.from 함수를 이용해서 배열화 시키고, 여기서 오늘의 kick. sort 메서드를 이용하여 두 개의 a, b 길이값을 비교하거나, 참조 문자열이 정렬 순으로 지정된 문자열 앞 혹은 뒤에 오는지 또는 동일한 문자열인지 나타내는 수치를 반환하는 localeCompare()를 같이 비교해준다. 마지막으로 개행문자를 합쳐주면 원하는 값이 도출된다.

let result = Array.from(sortWord)
  .sort((a, b) => a.length - b.length || a.localeCompare(b))
  .join("\n");

 

⭐ 제출답안

let input = require("fs")
  // .readFileSync(0, "utf-8")
  .readFileSync("./example.txt")
  .toString()
  .split("\n")
  .map((line) => line.replace("\r", "").split(" "));

const [length, ...rest] = input;
const N = parseInt(length, 10);
const arr = rest.slice(0, N);

function solution(N, arr) {
  let sortWord = new Set();
  for (let word of arr) {
    sortWord.add(word[0]);
  }

  let result = Array.from(sortWord)
    .sort((a, b) => a.length - b.length || a.localeCompare(b))
    .join("\n");

  console.log(result);
}
solution(N, arr);

 

⭐ 공부했던 개념들

 

Array.prototype.sort() - JavaScript | MDN

sort() 메서드는 배열의 요소를 적절한 위치에 정렬한 후 그 배열을 반환합니다. 정렬은 stable sort가 아닐 수 있습니다. 기본 정렬 순서는 문자열의 유니코드 코드 포인트를 따릅니다.

developer.mozilla.org

 

 

String.prototype.localeCompare() - JavaScript | MDN

localeCompare() 메서드는 참조 문자열이 정렬 순으로 지정된 문자열 앞 혹은 뒤에 오는지 또는 동일한 문자열인지 나타내는 수치를 반환합니다.

developer.mozilla.org