12915. 문자열 내 마음대로 정렬하기 - String.prototype.localeCompare

서진·2023년 6월 22일

programmers

목록 보기
20/33

🔻 문자열 내 마음대로 정렬하기

문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱스 1의 문자 "u", "e", "a"로 strings를 정렬합니다.

stringsnreturn
["sun", "bed", "car"]1 ["car", "bed", "sun"]
["abce", "abcd", "cdx"]2 ["abcd", "abce", "cdx"]

👀
난... 정말... 바본가.......

sort를 써야할 것 같아서 특정 문자 기준으로 정렬하기를 시도해보았지만, 잘 되지 않아서 dictionary를 써서 key와 value값으로 접근했다. 쉽게 풀 수 있는 문제를 돌아돌아 접근한 것 같다..

sort의 내부 원리에 대해서 공부 했는데 사용하질 못한 것 같아서... 넘나 아쉽...😇


[👩🏻‍💻내 코드]

function solution(strings, n) {
    // 미리 사전순 정렬
    let sorted_string = strings.sort();
    
    // 문자 : 기준 문자열 map 생성
    let map = {};
    sorted_string.forEach(v => {
        map[v] = v[n];
    })
    
    let answer = [];
    // 기준값을 오름차순으로 정렬
    let values = Object.values(map).sort();
    let keys = Object.keys(map);
    
    // value로 key 찾기
    for (let i = 0; i<strings.length; i++) {
        let key = keys.find(key => map[key] === values[i]);
        answer.push(key);
        // 중복 방지
        delete map[key];
    }
    
    return answer; 
}

✅ dictionary의 value값으로 key값 찾기

let 코드필요시삽입

[👀 참고용]

function solution(strings, n) {
    // strings 배열
    // n 번째 문자열 비교
    return strings.sort((s1, s2) => s1[n] === s2[n] ? s1.localeCompare(s2) : s1[n].localeCompare(s2[n]));
}

💡 String.prototype.localeCompare()

기준 문자열과 비교했을 때 비교 대상 문자열이 정렬상 전에 오는지, 후에 오는지, 혹은 같은 순서에 배치되는지를 알려주는 숫자를 리턴한다.

'a'.localeCompare('c'); // -1  
'c'.localeCompare('a'); // 1
'a'.localeCompare('a'); // 0

비교 문자열 < 비교 대상 문자열 return -1
비교 문자열 > 비교 대상 문자열 return 1
비교 문자열 = 비교 대상 문자열 return 0

💡 Array.prototype.sort()

sort()에서는 compareFunction이 주어지지 않으면 요소를 문자열로 변환하고 유니코드 포인트 순서로 문자열을 비교해서 정렬한다.

compareFunction이 주어지는 경우 compare함수의 반환값에 따라 정렬된다.

const numbers=[0,5,4,1,2];
numbers.sort((a,b)=>a-b); //오름차순
numbers.sort((a,b)=>b-a); //내림차순

반환값 < 0인 경우 a가 b보다 앞에 있어야 함
반환값 > 0인 경우 b가 a보다 앞에 있어야 함
반환값 = 0인 경우 순서를 바꾸지 않는다

profile
🫧 ☁️ 🌙 👩🏻•💻 🌿 🐱 🖱 🍟 🚀 ⭐️ 🧸 🍀 💗

0개의 댓글