Adventure of 빠타박스
article thumbnail
728x90
728x90
SMALL

수 정렬하기

시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율

1 초 128 MB 162853 92765 64216 57.991%

문제

N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.

입력

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

출력

첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.

예제 입력 1

5
5
2
3
4
1

예제 출력 1

1
2
3
4
5

알고리즘 라이브러리 사용

#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
	int N;
	cin >> N;
	int arr[1000];
	for (int i = 0; i < N; i++) {
		cin >> arr[i];
	}
	
	//입력 받은 정렬
	sort(arr, arr + N); //sort함수

	for (int i = 0; i < N; i++) {
		cout << arr[i] << "\\n";
	}
	return 0;
}
  • 먼저, N을 입력 받습니다. 그리고 N개의 숫자를 입력 받아 arr 배열에 저장합니다. 이때, arr 배열은 크기가 1000인 정적 배열로 선언됩니다.
  • 이후, 입력 받은 숫자들을 sort 함수를 이용하여 오름차순으로 정렬합니다.
  • sort 함수는 algorithm 라이브러리에 정의된 함수로, 첫 번째 인자는 정렬할 배열의 시작 주소를, 두 번째 인자는 정렬할 배열의 끝 주소를 가리킵니다. 이 코드에서는 arr 배열의 첫 번째 원소의 주소와 arr 배열의 N번째 원소의 다음 원소의 주소를 sort 함수의 인자로 넘겨주었습니다.
  • 마지막으로, 정렬된 arr 배열의 원소들을 하나씩 출력합니다. "\n"은 개행 문자를 의미합니다.

병합 정렬 사용하기

#include <iostream>
using namespace std;

void merge(int arr[], int left, int mid, int right) {
    int i = left, j = mid + 1, k = left;
    int temp[1000];

    // 두 부분 배열의 앞쪽 원소부터 비교하여 작은 값을 temp 배열에 넣는다.
    while (i <= mid && j <= right) {
        if (arr[i] <= arr[j]) {
            temp[k++] = arr[i++];
        }
        else {
            temp[k++] = arr[j++];
        }
    }

    // 왼쪽 부분 배열이 남았을 경우, 나머지 원소를 temp 배열에 넣는다.
    while (i <= mid) {
        temp[k++] = arr[i++];
    }

    // 오른쪽 부분 배열이 남았을 경우, 나머지 원소를 temp 배열에 넣는다.
    while (j <= right) {
        temp[k++] = arr[j++];
    }

    // temp 배열에 저장된 값을 arr 배열에 복사한다.
    for (int i = left; i <= right; i++) {
        arr[i] = temp[i];
    }
}

void merge_sort(int arr[], int left, int right) {
    if (left < right) {
        int mid = (left + right) / 2;

        // 왼쪽 부분 배열을 재귀적으로 정렬한다.
        merge_sort(arr, left, mid);

        // 오른쪽 부분 배열을 재귀적으로 정렬한다.
        merge_sort(arr, mid + 1, right);

        // 정렬된 두 부분 배열을 합병한다.
        merge(arr, left, mid, right);
    }
}

int main() {
    int N;
    int arr[1000];

    cin >> N;
    for (int i = 0; i < N; i++) {
        cin >> arr[i];
    }

    // 병합 정렬을 수행한다.
    merge_sort(arr, 0, N - 1);

    for (int i = 0; i < N; i++) {
        cout << arr[i] << "\\n";
    }

    return 0;
}

 

  • 병합 정렬은 분할 정복(divide and conquer) 기법을 이용하여 동작합니다. 먼저, 입력된 N개의 숫자를 반으로 나누어 두 개의 부분 배열로 나눕니다. 그 다음, 각 부분 배열을 병합 정렬을 이용하여 재귀적으로 정렬합니다. 마지막으로, 두 개의 정렬된 부분 배열을 병합하여 전체 배열을 정렬합니다.
  • merge 함수는 두 개의 정렬된 부분 배열을 병합하는 함수이며, merge_sort 함수는 병합 정렬 알고리즘을 구현한 함수입니다. merge_sort 함수는 재귀적으로 호출되며, 배열을 반으로 나누어 재귀적으로 정렬하는 merge_sort 함수와 정렬된 두 개의 부분 배열을 병합하는 merge 함수를 호출합니다.

 


삽입 정렬 사용하기

#include <iostream>
using namespace std;

int main(void)
{
	int N, cnt;
	int arr[1000];
	cin >> N;
	for (int i = 0; i < N; i++) {
		cin >> arr[i];
	}

	for (int i = 0; i < N; i++) {
		cnt = arr[i];
		int j;
		for (j = i - 1; j >= 0; j--) {
			if (arr[j] > cnt)
				arr[j + 1] = arr[j];
			else
				break;
		}
		arr[j + 1] = cnt;
	}
	for (int i = 0; i < N; i++) {
		cout << arr[i] << "\\n";
	}
	return 0;
}
  • 먼저, N을 입력 받고 N개의 숫자를 입력 받아 arr 배열에 저장합니다. 이때, arr 배열은 크기가 1000인 정적 배열로 선언됩니다.
  • 그 다음, 삽입 정렬 알고리즘을 이용하여 arr 배열을 오름차순으로 정렬합니다. 삽입 정렬은 현재 위치에서 그 이하의 배열들을 비교하여 자신이 들어갈 위치를 찾아 삽입하는 방식으로 동작합니다.
  • 반복문을 이용하여 arr 배열을 순차적으로 탐색합니다. 각 원소가 삽입될 위치를 찾기 위해, 현재 원소보다 작은 원소가 나타나는 위치를 찾습니다. 이 위치는 j 변수에 저장되며, j 변수가 -1이 되거나 현재 원소보다 작은 원소가 나타나지 않으면 반복문을 종료합니다. 그리고 현재 원소(cnt)를 j+1번째 위치에 삽입합니다.
  • 마지막으로, 정렬된 arr 배열의 원소들을 하나씩 출력합니다. "\n"은 개행 문자를 의미합니다.
728x90
728x90
LIST
profile

Adventure of 빠타박스

@PPATABOX

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!