프로그래밍 & IT 정보/Javascript

자바스크립트 아스키 코드 정렬

아미넴 2020. 9. 24.
반응형

배열을 인자로 받아서 아스키 코드 순으로 정렬을 한 뒤 리턴하는 함수를 작성해 보겠습니다.

function asciiSort(input, reverse) {
    var output = [],
        temp;

    if (input != undefined && input != null) {
        for (var i = 0; i < input.length; i++) {
            output.push(input[i]);
        }
        for (var i = 0; i < input.length; i++) {
            for (var j = i + 1; j < input.length; j++) {
                if (compareTo(output[i], output[j], reverse)) {
                    temp = output[i];
                    output[i] = output[j];
                    output[j] = temp
                }
            }
        }
    }
    return output;
};

reverse 여부도 인자로 받아서 역순 정렬까지 고려를 하였습니다.

먼저 input으로 받은 배열을 그대로 output 변수에 복사를 합니다.

앞뒤 값을 비교하여 순서를 바꾸는 버블 정렬을 이용하였습니다.

높은 시간 복잡도를 갖지만 단순하여 자주 쓰입니다.

 

 

그럼 compareTo 함수에 아스키 코드 값 크기를 비교하는 로직을 넣어 보겠습니다.

function compareTo(o1, o2, reverse) {
    var m, result;

    m = Math.min(o1.length, o2.length);
    result = true;

    for (var i = 0; i < m; i++) {
        if (o1.charCodeAt(i) !== o2.charCodeAt(i)) {
            result = o1.charCodeAt(i) > o2.charCodeAt(i);
            break;
        }
    }
    result = !reverse ? result : !result;
    return result;
}

앞 자리부터 차근차근 비교하여 다른 값이 나오는 지점에서 크기를 판단하여 boolean 값을 리턴합니다.

다만 'aaa'와 'aaab'를 비교하게 되면 결국 앞 3자리가 같으므로 더 이상 비교하지 못하고 초기 셋팅 값인 true를 리턴하게 될 겁니다.

물론 reverse가 true라면 그 반대가 되겠죠.

 

 

작성 함수를 이용하여 간단히 예제를 돌려 보겠습니다.

(function(){
    var test = ['fd', 'ea', 'fsd', 'ecb', 'aa', 'fb'];
    console.log(asciiSort(test, false));
})();

// 출력 결과: ["aa", "ea", "ecb", "fb", "fd", "fsd"]

아스키 코드 순으로 정확히 정렬이 되었습니다.

반응형

댓글

💲 추천 글