어떤수 N이 있을때 N의 각 자리수를 내림차순으로 정렬한다고 할 때,
ex)
123456789라는 수를 987654321으로 정렬
111222333을 333222111으로 정렬하고자 할 때,
다음과 같은 생각을 해 볼 수 있다.
숫자로 이 값을 본다면 int형으로 값이 들어가게되고 만약 단위가 커지면 long long int형까지 가게되는데 그 이상으로 간다면 까다로워 질 수 있고,
수가 커질수록 자릿수를 구분하기에는 상당한 시간이 걸릴 수 도 있다.
이때는 이 수를 수로 보는게 아닌 문자로 생각한다.
즉, 12345를 만이천삼백사십오가 아닌 '1','2','3','4','5'로 생각하고 알고리즘을 접근 하면 한층 더 쉬워진다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | #include <stdio.h> #include <string.h> int main() { char a[15]; int b[15] = {0,}; int i,len; scanf("%s",a); len = strlen(a); // 문자열의 길이를 받아온다. for(i = 0 ; i < len ; i ++) b[a[i]-48]++; // a배열에 있는 각 값이 b배열의 위치가 되고, 그 위치의 값을 +1해준다. for(i = 9 ; i >= 0 ; i --) // 수는 0~9까지 이기에 for문을 9부터 돌린다. { while(b[i] != 0) { printf("%d",i); b[i]--; // 값을 하나씩 빼면서 b배열의 값을 -1해준다. } } return 0; } | Crocus |
b[a[i]-48]++; 의미를 다시 생각해 본다면
(이때 a배열은 char, b배열은 int로 설정하였다.(물론 이 코드에서 살짝 수정을 한다면 b배열을 char로 설정하여 코딩하여도 된다.))
예를들어 111222333이라는 값을 입력받게 되었을때,
a[1] = 1
a[2] = 1
a[3] = 1
a[4] = 2
a[5] = 2
a[6] = 2
a[7] = 3
a[8] = 3
a[9] = 3
b[a[1]] = b[1] = 1;
(++하였으므로)
b[a[2]] = b[1] = 2;
b[a[3]] = b[1] = 3;
b[a[4]] = b[2] = 1;
.
.
.
b[a[9]] = b[3] = 3;
즉 b[1] = 3, b[2] = 3, b[3] = 3이 들어가게된다.
이 의미는 1이라는 수가 3개, 2라는 수가 3개, 3이라는 수가 3개라는 뜻을 가지고 있고
이 배열을 역출력하면 내림차순으로 도출된다.
'Applied > 알고리즘 문제풀이' 카테고리의 다른 글
재귀 함수를 이용한 순열(Permutation) 알고리즘 (0) | 2016.03.19 |
---|---|
진법 변환 (0) | 2016.03.19 |
문자열 뒤집기 응용 (0) | 2016.03.01 |
1,2,3을 이용하여 값 구하기 (0) | 2016.02.23 |
큰수 A+B (0) | 2016.01.25 |