본문 바로가기
내일배움 과제/코딩테스트

알고리즘 47 - 문자열 내 마음대로 정렬하기

by GREEN나무 2024. 12. 26.
728x90

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

JS

문제

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

제한 조건
strings는 길이 1 이상, 50이하인 배열입니다.
strings의 원소는 소문자 알파벳으로 이루어져 있습니다.
strings의 원소는 길이 1 이상, 100이하인 문자열입니다.
모든 strings의 원소의 길이는 n보다 큽니다.
인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치합니다.

 


계획

n번째 문자를 문자열 맨 앞에 추가하여 새로운 배열 생성

오름차순 정렬

맨앞의 n번째 문자 지우기

반환


참고, 풀이

substring() 메소드는 string 객체의 시작 인덱스로 부터 종료 인덱스 전 까지 문자열의 부분 문자열을 반환합니다.

const str = 'Mozilla';

console.log(str.substring(1, 3));
// Expected output: "oz"

console.log(str.substring(2));
// Expected output: "zilla"

function solution(strings, n) {
    return strings
        .map((value) => `${value[n]}${value}`)
        .sort()
        .map((str) => str.substring(1));
}

 

 

다른사람 답

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

sort() 메서드의 작동 방식

sort() 메서드는 두 요소를 비교하여 반환값에 따라 순서를 결정합니다:

sort()
sort((s1, s2) => 비교식)

비교 함수 (s1, s2)

   sort 메서드는 비교 함수 (s1, s2)를 사용합니다.

   s1과 s2는 배열에서 비교할 두 문자열입니다.

 

반환값

   반환값이 음수: 첫 번째 요소가 두 번째 요소보다 앞에 위치.

   반환값이 0: 두 요소의 순서를 유지.

   반환값이 양수: 첫 번째 요소가 두 번째 요소보다 뒤에 위치.

 

 

String.prototype.localeCompare()

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare

s1.localeCompare(s2)

  • localeCompare()는 두 문자열을 사전 순으로 비교합니다:
    • s1이 s2보다 작으면 음수 반환.
    • 같으면 0 반환.
    • 크면 양수 반환.
  • 두 n번째 문자가 같을 경우, 전체 문자열을 사전 순으로 비교하여 정렬합니다.

s1[n].localeCompare(s2[n])

  • 두 n번째 문자가 다르다면, localeCompare를 사용해 해당 문자들만 비교합니다:
    • s1[n]이 s2[n]보다 작으면 음수 반환.
function solution(strings, n) {
    return strings.sort((a, b) => {
        const chr1 = a.charAt(n);
        const chr2 = b.charAt(n);

        if (chr1 == chr2) {
            return (a > b) - (a < b);
        } else {
            return (chr1 > chr2) - (chr1 < chr2);
        }
    })
}

(a > b) - (a < b)는 compareFunction의 핵심적인 비교 로직으로, 기본적인 사전순 정렬을 구현한 것입니다.

js에서 true - false = 1

 

sort(compareFunction)의 동작
compareFunction은 배열의 두 요소 a와 b를 비교하여 반환값에 따라 정렬 순서를 결정합니다.

 

  • 첫 번째 조건: 비교 기준인 n번째 문자(chr1, chr2)가 같은 경우
    사전순으로(a와 b) 정렬합니다.
    return (a > b) - (a < b);
    
    • (a > b)는 a가 b보다 크면 true(1) 반환.
    • (a < b)는 b가 a보다 크면 true(1) 반환.
    • 결과적으로 (a > b) - (a < b)는:
      • 1 - 0 = 1 → a가 b 뒤에 위치.
      • 0 - 1 = -1 → b가 a 뒤에 위치.
      • 0 - 0 = 0 → 순서 유지.
  • 두 번째 조건: n번째 문자가 다를 경우
    n번째 문자를 기준으로 정렬.
    return (chr1 > chr2) - (chr1 < chr2);
    
function solution(strings, n) {
    return strings.sort((a, b) => {
        const diff = a.charAt(n).localeCompare(b.charAt(n));
        return diff !== 0 ? diff : a.localeCompare(b);
    });
}
  • localeCompare: 두 문자열을 사전순으로 비교합니다.
    • a.charAt(n).localeCompare(b.charAt(n))는 n번째 문자를 기준으로 정렬.
    • a.localeCompare(b)는 문자 전체를 기준으로 사전순 정렬.

 


참고

https://school.programmers.co.kr/learn/courses/30/lessons/12915/solution_groups?language=javascript