06. sort


📌 6-1 sortは?


✔配列.sort(コールバック関数(比較(a,b))
✔Unicode順に昇順で戻る.
✔コールバック関数内にaとbを作成し、aとbをunionコードに変換して比較し、返します.
✔円がきちんと並んでいます.新しい配列コピーとして返されません.

📌 6-2 sort操作例


コールバック関数を渡さない場合は、Unicode順に昇順に並べ替えます.
const arr = ['A','D','B','C','Z','F'];
arr.sort(); // 유니코드 순으로 오름차순 정렬 시작
console.log(arr); // [ 'A', 'B', 'C', 'D', 'F', 'Z' ] 출력
コールバック関数を渡さないと、数値型に問題が発生します.
const arr = [11, 7, 3, 19, 24];
arr.sort(); // 유니코드 순으로 오름파순 정렬 시작
console.log(arr); // [ 11, 19, 24, 3, 7 ] 출력
最初の位置を先に比較するので、1 1 1 2 3 7の順に並べ替えます.
しかし3は最小の数字であり,コールバック関数を加えることで問題を解決できる.

📌 6-3 sortコールバック関数の使用

const arr = [11, 7, 3, 19, 24];
arr.sort((a,b) => a-b); // 숫자 오름차순 정렬
console.log(arr); // [ 3, 7, 11, 19, 24 ] 출력
Mdnを参照してコールバック関数の使用方法を記述した.
コールバック関数をcompareと呼んで表現します.
  • compare(a,b)では、戻り値が0未満の場合、aが返される.
  • compare(a,b)では、戻り値が0より大きい場合、bが返される.
  • compare(a,b)では、戻り値が同じであれば、順序は変更されません.
  • は、すべてのaおよびbにおいて、戻り条件が満たされるまで前に確認され、並べ替えられる.
  • const arr = [11, 7, 3, 19, 24];
    arr.sort((a,b) => b-a); // 숫자 내림차순 정렬
    console.log(arr); // [ 24, 19, 11, 7, 3 ]
    ランダムにゼロを返して、配列が変化しているかどうかを見てみましょう.
    const arr = [11, 7, 3, 19, 24];
    arr.sort((a,b) => 0); // 0을 반환
    console.log(arr); // [ 11, 7, 3, 19, 24 ] 출력
    このように0を返すと、円配列が返されます.

    📌 6-4 2つ以上の条件のソート


    年齢順に昇順に並べ、年齢が同じ場合はアルファベット順に並べたコード.
    const arr = [
        { firstName: 'Park', lastName: 'Sara', age: 18 },
        { firstName: 'Lee', lastName: 'Sin', age: 21 },
        { firstName: 'Kim', lastName: 'Song', age: 24 },
        { firstName: 'Son', lastName: 'San', age: 21 }
    ];
    arr.sort((a, b) => {
      // 0일경우 나이가 같음
        if(a.age - b.age === 0) {
          // 문자열 사전순으로 반환
            return a.firstName.localeCompare(b);
        } return a.age - b.age;
    });
    console.log(arr);
    💡 Str1.localeCompare(Str 2)辞書順にStr 1が先にある場合、負の値は戻り、正の値が同じであれば0を返します.
    これだけの条件があっても、ソートできます.

    📌 6-5ソートの選択


    sortを用いたソートは便利であるが,いくつかのソートアルゴリズムがコードで実現できる開発者になりたいと考え,ソートを学習した.最も基本的な選択ソートアルゴリズムについて説明します.
    function selectionSort(arr) {
      // 2중 포문으로 배열탐색 시작
        for (let i = 0; i < arr.length - 1; i++) {
            let index = i;
            for (let j = i + 1; j < arr.length; j++) {
              // 탐색 하던 구간중 제일 큰 값을 index에 대입
                if(arr[j] < arr[index]) index = j;
            }
          // 진행중인 배열과 배열뒤의 숫자를 바꿔준다.
            const [acc, curr] = [arr[i], arr[index]];
            arr[index] = acc;
            arr[i] = curr;
        }
        return arr;
    }
    console.log(selectionSort([5, 13, 11, 7, 23, 15])); // 오름차순 정렬

    📌 6-6ソートの質問に答える


    バックグラウンドソートの問題(1431:シリアル番号)
    function solution(arr) {
        let answer = '';
        // 정렬시작
        arr.sort((a, b) => {
            // 문자열 길이가 작은순서대로 오름차순 정렬
            if(a.length < b.length) {
                return a.length - b.length;
            }
            // 문자열 길이가 같다면 예외처리
            if(a.length === b.length) {
                // 문자열 안에 있는 숫자들의 합이 작은순대로 오름차순 정렬
                const A = a.replace(/[a-z]/gi, "0").split('').map((item) => +item).reduce((acc, curr) => acc + curr);
                const B = b.replace(/[a-z]/gi, "0").split('').map((item) => +item).reduce((acc, curr) => acc + curr);
                // 숫자도 같으면 사전순으로 정렬
                if(A === B) {
                    return a.localeCompare(b);
                }
                return A - B;
            }
        });
        // 정답 정제
        for(let item of arr) {
            answer += item + '\n';
        }
        return answer.trim();
    }