IT/Algorithm

프로그래머스) 문자열 내 마음대로 정렬하기

프티 2021. 10. 25. 14:48
반응형

https://programmers.co.kr/learn/courses/30/lessons/12915

 

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

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

programmers.co.kr

나의 풀이

function solution(strings, n) {
    return strings.sort((a, b) => {
        if (a[n] < b[n]) {
            return -1;
        } else if (a[n] > b[n]) {
            return 1;
        }
        
        return a < b ? -1 : 1;
    });
}

해당 위치의 문자가 같을 때, 문자열 전체를 비교할 수 있도록 삼항 연산자를 활용하여 -1 또는 1을 반환하였다.

 

다른 사람의 풀이

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

내가 알지 못한 localeCompare라는 메서드를 사용하신 게 눈에 띄었다.

 

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

 

반환 값으로 음수가 나오면 기준 문자열이 비교 문자열 이전에 위치해야하는 경우이고,

양수가 나오면 기준 문자열이 비교 문자열 이후에 위치해야하는 경우이다. 0이 나오면 같은 위치!

 

sort에 콜백 함수를 넣어주는 것보다 훨씬 간단해서 나중에 꼭 써먹어야겠다!

 

또 다른 사람의 풀이

function solution(strings, n) {
    return strings.map(a=>[...a][n]+a).sort().map(a=>a.substring(1));
}

이분은 훨씬 더 짧다..?

 

전개 연산자를 활용해서 배열로 바꾼다음 해당 위치의 문자를 전체 문자열 맨 앞에 위치시켰다.

이를 통해 정렬의 최우선 기준으로 만든 다음 sort()하였고, map과 substring을 활용하여 다시 맨 앞의 문자를 제외하였다.

(substring은 slice와 비슷한 메서드이다.)

반응형