촉촉한초코칩

[백준] 10989 (수 정렬하기3) c언어 본문

Algorithm

[백준] 10989 (수 정렬하기3) c언어

햄친구베이컨 2022. 9. 21. 00:23

문제

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

입력

첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 10,000보다 작거나 같은 자연수이다.

출력

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

 


 

처음에는 calloc으로 배열 크기대로 메모리 공간을 만들고 

이중 for문을 사용해서 오름차순으로 다시 배열에 넣은 다음 출력했는데, 

메모리 초과/런타임 에러 등 틀렸다고 나왔다. 

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

int main(void) {

	int a;
	int *num;
	scanf("%d", &a);

	num = (int *)calloc(a, sizeof(int));

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

	int tmp = 0;

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

	for(int i=0; i<a; i++) {
		printf("%d ", num[i]);
	}

	free(num);
}

 

그래서 검색한 내용으로 내가 한 방법 말고 다른 방법으로 풀어서 정답으로 제출했다. 

 

먼저 define으로 size와 배열을 초기화시키고, 입력받은 개수만큼 배열에 숫자를 입력받는다. 

문제에서 두번째 입력값은 10,000보다 작은 수라고 했으므로 그 수만큼 배열 크기를 정의한 다음에, 해당하는 배열 위치에 값을 넣는다.

 

다시 for문을 size만큼 돌리고 만약 cnt 값이 0이라면 (입력하지 않은 숫자) 무시하고

값이 있다면 다시 for문을 돌려서 그 값만큼 인덱스 값을 출력하도록 한다. 

https://mjeong9316.tistory.com/171

#include <stdio.h>

#define size 10001
int cnt[size] = {0,};

int main(void) {

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

	for(int i=0; i<=size; i++) {
		if (cnt[i]==0)
			continue;

		for(int j=0; j<cnt[i]; j++)
			printf("%d\n", i);
	}
	

}