글 작성자: 망고좋아
반응형

 

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

📁 문제 출처

 

코딩테스트 연습 - 문자열 내 마음대로 정렬하기

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

programmers.co.kr

 

💡 생각

  • 첫 번째 조건인 n번째 인덱스를 기준으로 정렬해주고, n번째 알바펫이 같으면 사전 순으로 정렬해주면 모든 조건을 충족시킨다.

 

🛠 나의 코드

function solution(strings, n) {
    let answer = strings.sort((a, b) => {
        if(a[n] > b[n]) {
            return 1;
        }
        if(a[n] < b[n]) {
            return -1;
        }       
        if(a[n] === b[n]) {
            if(a > b) {
                return 1;
            }
            if(a < b) {
                return -1;
            }                        
            return 0;
        }       
    })
    return answer;
}

 

리팩토링

function solution(strings, n) {
    strings.sort((a, b) => {
        let first = a[n];
        let second = b[n];

        if (first === second) {
            return (a > b) - (b > a)
        } else {
            return (first > second) - (second > first)
        }
    })

    return strings;
}
  • strings을 정렬해주고 first와 second가 같다면 사전 순으로 정렬해준다.
  • (a > b) - (b > a) 이 코드는
    • (a > b) 가 true (b > a)가 false면 1 - 0으로 1을 반환
    • (a > b)가 false (a < b) 가 true면 0 - 1으로 -1을 반환
    • 따라서 true면 1을 false면 -1을 반환해주므로 코드를 간결하게 작성할 수 있다.
    • 첫 코드의 10~16번째 코드를 한 줄로 줄일 수 있다.
  • (first > second) - (second > first) 코드도 위와 동일한 원리로 작동

 

다른 풀이

function solution(strings, n) {
    return strings.sort((s1, s2) => s1[n] === s2[n] ? s1.localeCompare(s2) : s1[n].localeCompare(s2[n]));
}

 

✔️ 배운 점 및 주의할 점

localeCompare()

'a'.localeCompare('c'); // -2 or -1, a가 c 앞에 오기 때문에 음수를 리턴

'check'.localeCompare('against'); // 2 or 1, 알파벳 순으로 check가 against 뒤에 오기 때문에 양수를 리턴

'a'.localeCompare('a'); // 0, 동일하면 0을 리턴
  • 인수로 전달받은 문자열과 정렬 순서로 비교하여 그 결과를 정수 값으로 반환해준다.

 

📌 참고

반응형