언어/c, c++

백준(BAEKJOOB) 2750번 수 정렬하기 문제 c언어

깡 딱 2023. 1. 8. 16:38
728x90

문제

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


입력

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


 


이 문제를 풀기 위해서는 알고리즘을 잘 알아야 하는데

(알고리즘은 문제를 해결하기 위한 일련의 순서적인 계산/풀이 절차/방법이다. )

저는 버블정렬로 풀어 보겠습니다.

(버블정렬은 인접한 두 수를 검사하여 정렬하는 알고리즘이다.)

 

 

	scanf("%d", &cas);
	for (i = 0; i < cas; i++) {
		scanf("%d", &a[i]);
	}

 

먼저 입력받을 케이스와 원소들을 입력받아주고

 

 

	for (i = 0; i < cas; i++) {
		for (j = i + 1; j < cas; j++) {
			if (a[i] > a[j]) {
				tmp = a[i];
				a[i] = a[j];
				a[j] = tmp;
			}
		}
	}

 

수를 비교할 수 있게 반복문을 준비하여 준다.

예를 들어 숫자가 2 1 이 입력받았다면

 

a [0] 번째 숫자 2와 a[1]번째 숫자 1과 비교를 하는것이다. 

 

 a[0]번째 숫자가 더 크기 때문에 

				tmp = a[i];
				a[i] = a[j];
				a[j] = tmp;

 

a [0]은 1이 되고 a [1]은 2가 되는 것이다. 

 

하지만 버블 정렬은 N(1 ≤ N ≤ 1,000)

이렇게 범위가 1000밖에 되지 않기 때문에 

 

가능합니다 만약 범위가 큰 수를 주고

짧은 시간 안에 계산하라는

문제가 나온다면

이 알고리즘으로는 틀렸습니다.라고 나오게 되는 것이다.

 

총 코드

#include <stdio.h>

int main() {
	int a[1000];
	int cas;
	int i, j;
	int tmp;

	scanf("%d", &cas);
	for (i = 0; i < cas; i++) {
		scanf("%d", &a[i]);
	}

	for (i = 0; i < cas; i++) {
		for (j = i + 1; j < cas; j++) {
			if (a[i] > a[j]) {
				tmp = a[i];
				a[i] = a[j];
				a[j] = tmp;
			}
		}
	}
	for (int i = 0; i < cas; i++) {
		printf("%d ", a[i]);
	}

}

 

728x90