반응형

어떤수 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