백준 알고리즘 문제 풀이 - 2차시

알고리즘 수업 - 버블 정렬 1 - 23968번

#include <stdio.h>

int main() {
    int n;   
    int num;    
    int count = 0;

    scanf("%d %d", &n, &num); //입력을 받는다
    int arr[n];

    for (int i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }

    for (int i = 0; i < n - 1; i++) { //버블정렬을 한다
        for (int j = 0; j < n - 1 - i; j++) { 
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;

                count++; //교환횟수를 증가해준다

                if (count == num) { //만약 num번째면 종료
                    printf("%d %d\n", arr[j], arr[j + 1]);
                    return 0;
                }
            }
        }
    }

    printf("-1\n"); 교환횟수 < num 이면 -1 출력
    return 0;
}

배열의 크기, 교환횟수, 배열의 원소를 받고 버블정렬을 하고 입력받은 교환횟수 번째의 교환을 한 후에 교환된 그 두수 두개를 출력한다.

알고리즘 수업 - 버블 정렬 2 - 23969번

#include <stdio.h>

int main() {
    int n;   
    int num;    
    int count = 0;

    scanf("%d %d", &n, &num); //입력받는다
    int arr[n];

    for (int i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }

    for (int i = 0; i < n - 1; i++) {  //버블정렬을 한다
        for (int j = 0; j < n - 1 - i; j++) { 
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;

                count++; //교환횟수 증가
                if (count == num) {  //num번째 교환이면 ㅊ출력
                    for (int i = 0; i < n; i++) {
                        printf("%d ", arr[i]);
                    }
                    printf("\n");
                    return 0;
                }
            }
        }
    }

    printf("-1\n"); //교환횟수 < num 일때 -1 출력
    return 0;
}

 

배열 크기, 교환 횟수, 배열의 원소들을 입력받고, 버블정렬 하고 입력받은 교환횟수 번째의 교환을 한 후 그 정렬된 수들을 출력한다

 

알고리즘 수업 - 선택 정렬 1 - 23881번

#include <stdio.h>

int main() {
    int n, k;
    scanf("%d %d", &n, &k); //입력 받는다

    int arr[n];
    for (int i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }

    int count = 0;

    for (int i = n - 1; i > 0; i--) { //선택 정렬을 한다
        int max = i;
        for (int j = i - 1; j >= 0; j--) {
            if (arr[j] > arr[max]) {
                max = j; //
            }
        }

        if (max != i) {
            int temp = arr[i];
            arr[i] = arr[max];
            arr[max] = temp;

            count++;
            if (count == k) {
                printf("%d %d\n", arr[max], arr[i]); k번째 일시 출력
                return 0;
            }
        }
    }

    printf("-1\n"); 실제 교환횟수 < 입력받은  교환횟수일때 출력 
    return 0;
}

배열의 크기, 교환횟수, 배열의 원소를 받고 선택정렬을 하고 입력받은 교환횟수 번째의 교환을 한 후에 교환된 그 두수 두개를 출력한다.

알고리즘 수업 - 선택 정렬 2 - 23882번

#include <stdio.h>

int main() {
    int n, k;
    scanf("%d %d", &n, &k); //입력을 받는다
    int arr[n];
    for (int i = 0; i < n; i++) scanf("%d", &arr[i]);

    int count = 0;

    for (int last = n - 1; last >= 1; last--) { //선택 정렬을한다
        int max = 0;
        for (int i = 1; i <= last; i++) {
            if (arr[i] > arr[max]) max = i;
        }
        if (max != last) {
            int temp = arr[last];
            arr[last] = arr[max];
            arr[max] = temp;
            count++;
            if (count == k) {
                for (int i = 0; i < n; i++) {
                    printf("%d", arr[i]);
                    if (i != n - 1) printf(" ");
                }
                printf("\n"); // 만약 k번째 이면 출력
                return 0;
            }
        }
    }

    printf("-1\n"); 실제 교환가능 횟수 < k값이면 출력
    return 0;
}


배열 크기, 교환 횟수, 배열의 원소들을 입력받고, 선택정렬 하고 입력받은 교환횟수 번째의 교환을 한 후 그 정렬된 수들을 출력한다

알고리즘 수업 - 삽입 정렬 1 - 23882번

#include <stdio.h>

int main() {
    int size, k, count = 0;
    scanf("%d %d", &size, &k); //입력을 받는다
    int arr[size];
    for (int i = 0; i < size; i++) scanf("%d", &arr[i]);

    for (int i = 1; i < size; i++) { //삽입정렬을 한다
        int n = arr[i];
        int num = i - 1;

        while (num >= 0 && arr[num] > n) { //값 밀기 저장
            arr[num + 1] = arr[num]; 
            num--;
            count++;
            if (count == k) {
                printf("%d\n", arr[num + 1]); //k번째 저장이면 출력
                return 0;
            }
        }

        if (num + 1 != i) {
            arr[num + 1] = n; //빈자리에 저장
            count++;
            if (count == k) { //k 번째 저장이면 출력
                printf("%d\n", n);
                return 0;
            }
        }
    }

    printf("-1\n"); //실제 교환 가능 횟수 < k이면 출력
    return 0;
}

배열의 크기, 교환횟수, 배열의 원소를 받고 삽입정렬을 하고 입력받은 교환횟수 번째의 교환을 한 후에 교환된 그 두수 두개를 출력한다.

알고리즘 수업 - 삽입 정렬 2 - 24052번

#include <stdio.h>

int main() {
    int n;   
    int num;    
    int count = 0;

    scanf("%d %d", &n, &num); //입력을 받는다
    int arr[n];

    for (int i = 0; i < n; i++) { 
        scanf("%d", &arr[i]);
    }

    for (int i = 1; i < n; i++) { //삽입정렬을 한다
        int new = arr[i];
        int j = i - 1;

        while (j >= 0 && arr[j] > new) { //밀기 저장
            arr[j + 1] = arr[j];
            j--;
            count++;
            if (count == num) {
                for (int k = 0; k < n; k++) {
                    printf("%d ", arr[k]); // num번째 저장이면 출력
                }
                printf("\n");
                return 0;
            }
        }

        if (j + 1 != i) {
            arr[j + 1] = new; //빈칸에 넣기 저장
            count++;
            if (count == num) {
                for (int k = 0; k < n; k++) {
                    printf("%d ", arr[k]); // num번째 저장이면 출력
                }
                printf("\n");
                return 0;
            }
        }
    }

    printf("-1\n"); // 교환횟수 < num 이면 -1출력
    return 0;
}

배열 크기, 교환 횟수, 배열의 원소들을 입력받고, 삽입정렬 하고 입력받은 교환횟수 번째의 교환을 한 후 그 정렬된 수들을 출력한다