: solved.ac (자율) - silver 5
https://www.acmicpc.net/problem/1427
1427번: 소트인사이드
첫째 줄에 정렬하려고 하는 수 N이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이다.
www.acmicpc.net
예제 입력 1
61423
예제 출력 1
64321
예제 입력 2
999998999
예제 출력 2
999999998
예제 입력 3
500613009
예제 출력 3
965310000
정답
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int dec[10];
int zero;
void seperate(long int n) {
int i = 0;
while (n != 0) {
if ((n % 10) == 0) zero++;
dec[i] = n % 10;
n /= 10;
i++;
}
}
int compare(const void* a, const void* b) {
int num1 = *(int*)a;
int num2 = *(int*)b;
if (num1 < num2) return 1;
else if (num1 > num2) return -1;
return 0;
}
int main() {
long int n;
int i = 0;
scanf("%ld", &n);
seperate(n);
qsort(dec, 10, sizeof(int),
compare);
while (dec[i] != 0) {
printf("%d", dec[i]);
i++;
}
for (int i = 0; i < zero; i++) printf("0");
return 0;
}
해설
- 입력된 수를 자릿수별로 잘라 배열에 넣는다. (이때 0의 갯수를 따로 세어준다.)
- 배열을 내림차순으로 정리한다.
- 배열을 출력하고, 세어두었던 갯수만큼 0을 붙여 출력한다.
1. 수는 최대 10자리의 큰 수이므로 숫자를 담을 배열도 최대 10칸, 수를 입력받을 변수는 long int 형으로 선언해준다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int dec[10]; //자릿수별로 숫자를 담을 배열
int zero; //0의 갯수를 셀 변수
int main() {
long int n;
int i = 0;
scanf("%ld", &n); //수 입력
seperate(n); //수를 자릿수별로 분리
2. 입력받은 수를 자릿수별로 분리하는 것은 함수를 작성해 따로 처리했다.
수를 입력받으면 먼저 1의 자리를 본다. 이때 1의 자리가 0이라면 전역변수 zero를 1 증가시켜 세어준다.
1의 자리 수를 배열 한 칸에 넣고, 전체 수를 10으로 나눈다.
이렇게 하면 10의 자리 수가 다시 1의 자리 수가 되므로, 반복하면 모든 자릿수를 잘라 배열에 넣을 수 있게 된다.
배열의 칸마다 각각 자릿수를 집어넣어야 하므로 반복마다 인덱스인 i를 증가시켜주는 것도 잊지 말도록 한다.
//수를 자릿수별로 분리하면서
//0의 갯수를 세어주는 함수
void seperate(long int n) {
int i = 0;
while (n != 0) {
if ((n % 10) == 0) zero++;
//자릿수 중 0이 있다면 카운트
dec[i] = n % 10;
//1의 자리를 잘라 배열에 넣고
n /= 10;
//10으로 나눠 10의 자리를 1의 자리로 만듦
i++;
//반복
}
}
3. 이것은 내림차순 정렬을 위한 비교 함수이다. stdlib.h에 들어 있는 내장함수인 퀵소트를 사용하는 데 필요하다.
return 1은 조건식이 참일 경우 num1을 num2의 뒷 순서로 바꾸겠다는 뜻이다. return -1은 그 반대가 된다.
내림차순 정렬은 큰 것부터 작은 것 순서대로 정렬하는 것이므로 조건식을 아래와 같이 적어주었다.
오름차순 정렬일 경우 반대로 쓰면 된다.
//내림차순 정렬을 위한 비교함수
int compare(const void* a, const void* b) {
int num1 = *(int*)a;
int num2 = *(int*)b;
if (num1 < num2) return 1;
else if (num1 > num2) return -1;
return 0;
}
4. 1번에서 적었던 main 함수의 뒷부분이다. 자릿수별로 쪼개둔 수를 qsort 내장함수로 정렬한 후
(인자는 정렬할 배열, 원소 갯수, 원소 크기, 비교 함수 순이다)
내림차순으로 정렬된 배열에서 0이 아닌 부분들만 우선 출력한다.
배열은 전역 변수로 선언되어 원래 0으로 초기화되어 있으므로
내림차순으로 정렬할 경우 수가 들어있지 않은 빈 칸과 0을 넣은 칸을 구분할 수 없기 때문이다.
0의 갯수는 위에서 자릿수를 쪼갤 때 미리 세어 두었으므로, 세어둔 수만큼 0을 따로 뒤에 출력해주면 된다.
qsort(dec, 10, sizeof(int), compare);
//분리한 자릿수들을 담은 배열을 내림차순 정렬
while (dec[i] != 0) {
printf("%d", dec[i]);
i++;
} //0이 아닌 부분만 일단 출력
for (int i = 0; i < zero; i++) printf("0");
//미리 세어 뒀던 0의 갯수만큼 0을 붙여 출력
return 0;
}
'C언어 > BAEKJOON' 카테고리의 다른 글
[백준] 2164. 카드2 (0) | 2022.06.25 |
---|---|
[백준] 1929. 소수 구하기 (0) | 2022.06.25 |
[백준] 2869. 달팽이는 올라가고 싶다 (0) | 2022.06.18 |
[백준] 2839. 설탕 배달 (0) | 2022.06.18 |
[백준] 1475. 방 번호 (0) | 2022.06.18 |