[MATLAB] 데이터 정렬하기, sort 함수 (응용: 학점 부여 프로그램)

코딩/matlab|2020. 6. 4. 13:56

오늘은 데이터를 정렬하는데 사용되는 sort 함수의 사용법에 대해 알아보도록 하겠습니다. 또한 sort 함수를 이용해서 입력된 학생들의 점수에 따라 학점을 부여하는 간단한 코드를 소개해드리겠습니다. 

 

sort 함수 기본 사용법

sort 함수는 기본적으로 오름차순으로 데이터를 정렬합니다. sort 함수가 데이터를 잘 정렬하는지 예제를 통해 살펴보겠습니다. 

 

clc, clear, close all

A = [19, 29, 38, 47, 26, 5, 17, 87, 44, 24, 67];
B = ["tistory", "image processing", "computer vision", "blog", "amazing", "good", "bskyvision"];

sort(A)
sort(B)

 

A 변수에는 숫자들이 담겨있고, B 변수에는 문자열들이 담겨있습니다. 위 코드를 실행해보겠습니다. 

 

오름차순으로 정렬했을 때

 

숫자들은 작은 것부터 큰 것으로, 문자열은 a부터 z 순으로 정렬된 것을 확인하실 수 있습니다. 

 

만약 내림차순으로 정렬하고 싶다면 sort(A, 'descend'), sort(B, 'descend')와 같이 'descend'를 두번째 파라미터로 추가해주시면 됩니다. 그렇게 설정한 후 실행하면 다음과 같이 내림차순으로 정렬됩니다. 

 

내림차순으로 정렬했을 때

 

또한 인덱스 정보가 필요한 경우에는 출력하는데 사용되는 sort 함수의 사용법에 대해 알아보도록 하겠습니다. 또한 sort 함수를 이용해서 입력된 학생들의 점수에 따라 학점을 부여하는 간단한 코드를 소개해드리겠습니다. 

 

index 정보가 필요할 때

또한 정렬을 해줄 때 인덱스(index) 정보가 필요한 경우도 있습니다. 원래 데이터에서 몇번째 위치하던 것이 정렬 후에 어디에 있는지를 알려주는 정보를 인덱스라고 합니다. 아래 예제를 보시면 이해가 되실 것입니다. 아래 코드를 실행해보겠습니다. 

 

clc, clear, close all

A = [15, 24, 9, 38, 21]

[sorted, index] = sort(A)

 

 

정렬 후에 첫번째에 위치한 9는 정렬 전에 세번째에 위치하던 것입니다. 그리고 정렬 후에 두번째에 위치한 15는 정렬 전에 첫번째에 위치하던 것입니다. 이것을 바로 sort 함수의 두번째 출력인 index가 알려줍니다. 

 

 

이 index라는 것은 비단 sort 함수 뿐만 아니라 다른 함수들에서도 많이 접하게 되니 무엇인지 알아두실 것을 추천드립니다.

 

응용: 학점 부여 프로그램

이제 마지막으로 sort 함수를 이용해서 간단한 응용 프로그램을 만들어보겠습니다. 바로 학생들의 점수를 1번부터 n번까지 순차적으로 입력하면 그중 누가 A인지, B인지, C인지, D인지, F인지를 알려주는 프로그램입니다. A를 받을 수 있는 학생은 전체의 20%가 되도록 했습니다. B, C, D, F도 마찬가지입니다. 

 

제가 작성한 코드는 다음과 같습니다. 입력받은 점수들을 내림차순 정렬해서 그 중 최상위 20%는 A를 받도록, 그 다음 20%는 B를 받도록,..., 최하위 20%는 F를 받도록 코딩했습니다. 

 

function grade()

    X = [];
    prompt = '점수 입력(점수 입력이 끝났다면 10000 입력):';

    while(1) 
        score = input(prompt);
        if score == 10000
            break;
        end
        X = [X, score];
    end

    [sorted_X, index] = sort(X, 'descend'); % 내림차순 정렬

    num = length(X);

    A = 1:round(num*0.2);
    B = round(num*0.2)+1:round(num*0.4);
    C = round(num*0.4)+1:round(num*0.6);
    D = round(num*0.6)+1:round(num*0.8);
    F = round(num*0.8)+1:num;

    A_student = index(A)
    B_student = index(B)
    C_student = index(C)
    D_student = index(D)
    F_student = index(F)

end

 

 

위 함수가 잘 작동하는지 한번 테스트해보겠습니다. 

 

클릭해서 보세요.^^

 

제가 입력한 대로라면 1, 3번 학생이 A를 받고, 5, 4, 8번 학생이 B를 받고, ...., 10, 9번 학생이 F를 받게 되는 군요. 

 

여담이지만 제 학부생 때를 생각해보니 A, B, C, D, F 모두 다 받아봤네요. 파란만장 했습니다...ㅋㅋ 

 

 

bskyvision의 추천글 ☞

[MATLAB] 비선형 회귀, nlinfit 함수와 nlpredci 함수