[C언어] 백준 25305. 커트라인

문제

2022 연세대학교 미래캠퍼스 슬기로운 코딩생활에 명의 학생들이 응시했다.

이들 중 점수가 가장 높은 명은 상을 받을 것이다. 이 때, 상을 받는 커트라인이 몇 점인지 구하라.

커트라인이란 상을 받는 사람들 중 점수가 가장 가장 낮은 사람의 점수를 말한다.

입력

첫째 줄에는 응시자의 수 과 상을 받는 사람의 수 가 공백을 사이에 두고 주어진다.

둘째 줄에는 각 학생의 점수 가 공백을 사이에 두고 주어진다.

출력

상을 받는 커트라인을 출력하라.

구상

C언어에서 제공하는 내장 정렬 함수를 활용해보겠다.

C언어에 내장되어 있는 정렬 함수인 qsort()를 활용했다.
qsort()는 stdlib.h 헤더파일에 있다.

기본형:

void qsort(
   void *base,
   size_t number,
   size_t width,
   int (__cdecl *compare )(const void *, const void *)
);


base는 대상 배열의 시작 부분으로 정렬하고 싶은 배열명을 입력한다.
number는 배열 크기로 sizeof(배열) / sizeof(자료형)을 입력한다.
width는 배열 요소로 크기이다. sizeof(자료형)을 입력한다.
compare는 각 요소를 비교하는 사용자 지정 함수를 만들어서 인자 없이 함수명만 입력한다.

qsort 함수를 이용하려면 compare함수를 작성할 때 약속된 값을 반환해야 한다. 
오름차순으로 정렬하고 싶다면 arg1 < arg2 일 때 음수를 반환하고,
내림차순일 때는 양수를 반환하면 된다. 

 

int compare(const void* arg1, const void* arg2) {
    int a = *(int*)arg1;    //void를 int형으로 변환
    int b = *(int*)arg2;

    if (a < b) return 1;    //내림차순 정렬
    else if (a > b) return -1;
    else return 0;
}



동점자 처리는 문제에서 명시하지 않았으니 처리하지 않아도 정답으로 인정한다. 

코드

#include <stdio.h>
#include <stdlib.h>

//비교 수행하는 함수, qsort의 4번째 인자
int compare(const void* arg1, const void* arg2) {
    int a = *(int*)arg1;    //void를 int형으로 변환
    int b = *(int*)arg2;

    if (a < b) return 1;    //내림차순 정렬
    else if (a > b) return -1;
    else return 0;
}

int main(void)
{
    int arr[1000] = { 0 };
    int sizeOfArr = sizeof(arr) / sizeof(int);  //배열의 크기
    int n, k, x;

    scanf("%d%d", &n, &k);
    for (int i = 0; i < n; i++) {   //학생의 수만큼 반복
        scanf("%d", &arr[i]);
    }

    qsort(arr, sizeof(arr) / sizeof(int), sizeof(int), compare);  //정렬
    printf("%d", arr[k - 1]);   //배열은 0부터 시작하므로 1 빼서 출력
    

    return 0;
}