본문 바로가기

컴퓨터/백준 알고리즘

백준 알고리즘 2750번: 수 정렬하기 C언어

문제 출처: www.acmicpc.net/problem/2750

 

2750번: 수 정렬하기

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 숫자가 주어진다. 이 수는 절댓값이 1,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.

www.acmicpc.net

1. 코드

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

int main(void)
{
    int * arr;
    int len, temp, i, j;
    
    scanf("%d", &len);
    arr = (int*) calloc(len, sizeof(int));
    
    for(i = 0; i < len; i++)
        scanf("%d", &arr[i]);
    
    for(i = 0; i < len; i++)
        for(j = i + 1; j <len; j++)
            if(arr[i] > arr[j])
            {
                temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
    
    for(i = 0; i < len; i++)
        printf("%d\n", arr[i]);
    
    free(arr);
    return 0;
}

(실행)

2. 문제 해결 방식

문제를 읽었을 때 N의 개수가 한정되어 있다. 하지만 나는 조금 유동적으로 입력이 가능하게 만들고 싶었다. 그래서 stdlib.h 헤더파일에 있는 calloc() 함수를 사용하여 동적할당을 충족시켰다. (calloc에 대해서)

int * arr;
int len, temp, i, j;
    
scanf("%d", &len);
arr = (int*) calloc(len, sizeof(int));

그리고 동적할당을 마친 배열에 수를 입력을 한다.

for(i = 0; i < len; i++)
    scanf("%d", &arr[i]);

처음 입력된 순서대로 차례로 배열의 초기화가 되었을 텐데 이제 정렬을 해보려한다. 정렬은 2중 반복문을 사용하여 구성하였는데 매우 단순한 구조이다.

for(i = 0; i < len; i++)
    for(j = i + 1; j <len; j++)
        if(arr[i] > arr[j])
        {
            temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }

이 배열이 돌아간다면 아래와 같이 실행이 된다.

순서 첫 번째 요소 두 번째 요소 세 번째 요소 네 번째 요소 다섯 번째 요소
1 5 4 3 2 1
2 4 5 3 2 1
3 3 5 4 2 1
4 2 5 4 3 1
5 1 5 4 3 2
6 1 4 5 3 2
7 1 3 5 4 2
8 1 2 5 4 3
9 1 2 4 5 3
10 1 2 3 5 4
11 1 2 3 4 5

 
다른 풀이 방법 : https://travelerfootprint.tistory.com/m/80(버블 정렬)