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
'Programming > CodingTest' 카테고리의 다른 글
[백준]_1546번_평균 구하기 [C++] (0) | 2023.03.29 |
---|---|
[백준]_10807번_개수 세기_ 쉬움[C++] (0) | 2023.03.13 |
[백준]_1008번_A/B_ 쉬움[C/C++/Python] (0) | 2023.03.13 |