처음에 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이 내림차순 정렬이라는 것도 복습했다.
코테 연습이니 웬만하면 풀어 쓰는 게 나은 것 같다.
글이 잘 정리되어 있네요. 감사합니다.