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

Sheryl Yun·2023년 7월 20일
0

문제 링크

처음 풀이

처음에 sort로 a[1]-b[1] 식으로 풀어봤지만 생각보다 잘 안 돼서
아래처럼 알파벳 내의 인덱스를 찾아서 인덱스 숫자 값으로 비교한 뒤 자리를 바꿔야 하면 splice로 자르고 추가하는 반복문을 돌렸다.

function solution(strings, n) {
    let alphabets = [...new Set('abcdefghijklmnopqrstuvwxyz')];
    
    for (let i = 0; i < strings.length - 1; i++) {
        let current = strings[i];
        let back = strings[i+1];
        
        if (alphabets.indexOf(current[n]) > alphabets.indexOf(back[n])) {
            strings.splice(i, 1, back);
            strings.splice(i+1, 1, current)
        }
    }
  
    return strings;
}

하지만 이 방법으로는 1번째 테케에서는 정렬이 되다 말았고 2번째 테케에서는 서로 같은 경우에 뒤의 문자가 추가로 비교되지 않았다 ㅠㅠ

for문을 한 번만 돌기 때문인 듯 했다. 기억으로 앞뒤 자리를 바꾸는 버블 정렬은 이중 for문
아무래도 sort 메서드를 써야 할 것 같았다. 하지만 도무지 코드를 모르겠어서 답을 찾았다.

새로운 풀이

자바스크립트에 localeCompare라는 메서드가 있다는 걸 처음 알았다.
문자열 비교할 때 a > b ? return 1 : return -1 이런 과정을 줄여준다고 한다.

결과적으로 과정이 하나도 안 보이는 매우 추상화된 코드가 되었다.

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

하지만 실행해보니 localeCompare를 모르면 저 코드가 대체 뭔 뜻인지 모를 수 있다는 건 둘째치고 실행 시간이 꽤 오래 걸린다.

메서드 사용 때문인 것 같아서 추상화를 풀어서 다시 작성했다.

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

체감상 동작이 훨씬 빨랐다. 이 짧은 코드에도 체감이 될 정도의 속도 차이
편하라고 메서드가 있어도 쓸 수가 없는 ㅠㅠ

덕분에 양수 1이 오름차순 정렬, 음수 1이 내림차순 정렬이라는 것도 복습했다.
코테 연습이니 웬만하면 풀어 쓰는 게 나은 것 같다.

profile
영어강사, 프론트엔드 개발자를 거쳐 데이터 분석가를 준비하고 있습니다 ─ 데이터분석 블로그: https://cherylog.tistory.com/

1개의 댓글

comment-user-thumbnail
2023년 7월 20일

글이 잘 정리되어 있네요. 감사합니다.

답글 달기