[코드트리] - 문자열의 길이 순

준성·2024년 5월 16일
0
post-thumbnail

sort 문제를 풀어보며 localeCompare() 메서드를 알게되어 정리해본다.

문제



[링크] : https://www.codetree.ai/training-field/search/problems/string-length-order?&utm_source=clipboard&utm_medium=text

입력값을 받아 문자열의 길이가 작은 순으로 출력하는 문제를 풀었다.
만약 문자열의 길이가 같다면 사전순으로 정렬하면된다.
sort를 이용하면서 풀면되겠다고 생각했고 그의 생각한 코드는 이렇다.

const fs = require('fs');
const input = fs.readFileSync(0).toString().trim().split('\n');

let wordLength = parseInt(input[0]);
let arr = [];

for(let i = 1; i <= wordLength; i++){
    arr.push(input[i])
}

arr = arr.sort((a, b) => return a.length - b.length).join('\n')

console.log(arr)

작성한 코드의 틀린점이 존재했다. 테스트케이스에서 문제가 틀렸다고 나왔다.
문자열이 같을때, 사전순으로 제대로 배치가 되질 않았다.
찾아보니 localeCompare() 메서드를 찾을 수 있었다.

localeCompare()

[MDN] : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare

문자열을 비교해 정렬 순서에 따라 문자열의 앞에오는지, 뒤에오는지 또는 동일한지 여부를 숫자로 반환하게 해준다.

const a = 'a'; 
const b = 'b'; 

console.log(a.localeCompare(b)); // -1 
console.log(b.localeCompare(a)); // 1

위처럼 a가 b와 비교할때 a가 앞에있다면 -1 뒤에 있다면 1 을 반환한다.
이걸 sort와 같이 이용해 볼 수 있다.

수정


const fs = require('fs');
const input = fs.readFileSync(0).toString().trim().split('\n');

let wordLength = parseInt(input[0]);
let arr = [];

for(let i = 1; i <= wordLength; i++){
    arr.push(input[i])
}

arr = arr.sort((a, b) => {
    if(a.length === b.length){
        return a.localeCompare(b)
    }
    return a.length - b.length
}).join('\n')

console.log(arr)

길이가 같을 때 비교하여 sort-1이 앞에서부터 정렬되기 때문에 이렇게 사용하게 되면
사전순으로 정렬이 가능하게 된다.

정리


가끔 코드트리 라는 곳에서 문제도 풀어보고 있는데 테스트 케이스에서 내가 어떤 부분이 틀렸는데 명확하게 보이기 때문에 좀 더 수월하게 고민하고 풀 수 있었던 것 같다.
localeCompare 메서드에 대해서는 오늘 알았다. 참 다양한 메서드가 존재하니
이걸 다 외우진 못하지만 어떤 상황에서 사용해야 할지는 알았던 시간이였다.

profile
코드를 그리다.

0개의 댓글