문제 설명
문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱스 1의 문자 "u", "e", "a"로 strings를 정렬합니다.
제한 조건
strings는 길이 1 이상, 50이하인 배열입니다.
strings의 원소는 소문자 알파벳으로 이루어져 있습니다.
strings의 원소는 길이 1 이상, 100이하인 문자열입니다.
모든 strings의 원소의 길이는 n보다 큽니다.
인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치합니다.
입출력 예
strings | n | return |
---|---|---|
["sun", "bed", "car"] | 1 | ["car", "bed", "sun"] |
["abce", "abcd", "cdx"] | 2 | ["abcd", "abce", "cdx"] |
생각보다 고생했다 ㅠㅠㅠ 쉬워보였는데..
그리고 나의 답은 매우 비효율적 이었다..
이따위로 어차피 map 을 두번쓰느니 그냥 for 쓰는것이 나을것 같은데다
너무 생각한 순서그대로 실행한게 보인다
n번째 글자 앞에 붙이고,
정렬하고,
앞에 붙은 글자떼고...
function solution(strings, n) {
var answer = [];
const added = strings.map(e => {
return e[n] + e;
});
added.sort();
answer = added.map(e => {
return e.slice(1, e.length);
})
return answer;
}
다른분들의 답을 보니 이런 신박한 해법도 있었다.
function solution(strings, n) {
return strings.sort((s1, s2) => s1[n] === s2[n] ? s1.localeCompare(s2) : s1[n].localeCompare(s2[n]));
}
근데 좀 어렵다 이건 깔끔하지만 생각하는데 시간도 걸리고...
그래서 선생님 등장
주어진 문제를 해결하는 방법으로 코드를 작성하셨고, 이 방법도 올바르게 동작하지만, 조금 더 효율적으로 코드를 개선할 수 있습니다. 현재 접근 방식은 각 문자열에 n번째 문자를 앞에 추가하고, 정렬한 후 다시 제거하는 과정을 포함합니다. 이러한 접근은 명확하고 이해하기 쉽지만, 정렬 과정에서 추가적인 문자열 조작을 요구합니다.
더 효율적인 방법은 sort()
함수에서 정렬 기준을 직접 지정하는 것입니다. 이를 통해 불필요한 문자열 조작을 줄이고 코드의 실행 효율성을 높일 수 있습니다. 다음은 개선된 코드 예시입니다:
function solution(strings, n) {
return strings.sort((a, b) => {
// 먼저 n번째 문자를 기준으로 비교
if (a[n] < b[n]) return -1;
if (a[n] > b[n]) return 1;
// n번째 문자가 동일한 경우, 전체 문자열을 사전순으로 비교
return a.localeCompare(b);
});
}
이 코드는 sort()
함수 내에서 두 요소 a
와 b
의 n번째 문자를 비교하고, 해당 문자가 같을 경우 전체 문자열을 사전순으로 비교합니다. 이렇게 하면 각 문자열을 변형할 필요 없이 직접 비교하고 정렬할 수 있으므로 더 깔끔하고 효율적인 코드가 됩니다.
마지막 localeCompare 가 아무튼 0을 리턴해서 sort 가 동작하는 그런.......그런..... 휴
'algorithm' 카테고리의 다른 글
코테6 - 배열의 유사도 (0) | 2024.03.04 |
---|---|
코테5 - 다음에 올 숫자 (0) | 2024.03.04 |
코테4 - 붕대감기 (0) | 2024.03.02 |
코테3 - 옹알이 (0) | 2024.03.01 |
코테1 - 최소직사각형 (1) | 2024.02.29 |