촉촉한초코칩
[백준] 10989 (수 정렬하기3) c언어 본문
문제
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);
}
}
'Algorithm' 카테고리의 다른 글
[백준] 10807 (개수 세기) c언어 (0) | 2023.01.03 |
---|---|
[백준] 1081(합) c언어 - 미해결 (0) | 2023.01.03 |
[백준] 25304 (영수증) c언어 (0) | 2022.08.12 |
02. 기본 자료구조 (0) | 2022.08.09 |
[백준] 3003 (킹, 퀸, 룩, 비숍, 나이트, 폰) C언어 (0) | 2022.08.09 |