본문 바로가기
Programming/BOJ

[C/C++] 백준 #1755 숫자놀이(정렬)

by 작은별하나 2022. 10. 10.
반응형

이번 문제는 숫자를 단어로 바꾸었을 때, 사전순서로 정렬하는 문제죠.

제 경우에는 ord란 배열을 이용해서 순서를 정했습니다.  최대 숫자가 99이므로 두자리 숫자가 최대가 됩니다.

 

 

0은 zero로 가장 순서가 늦게 되겠죠.  그 순서대로 하면 아래의 표대로 됩니다.  다른 숫자에 같은 단어가 있을 수 없으므로 1이 가장 앞에 수이고, 10이 가장 뒤의 수로 놓았습니다.  가장 앞의 수는 8(eight)가 됩니다.  

 

0 1 2 3 4 5 6 7 8 9
10 5 9 8 3 2 7 6 1 4

 

위의 표를 이용해서 cmp함수를 만들었습니다.  위의 표에서 제가 순서를 나타낼 때 0을 사용치 않은 것은 3과 38을 비교하기 위해서입니다.  0부터 시작했다면, 3과 38은 같은 값을 가지게 되었을겁니다.

 

수는 두자리 숫자인 경우 앞의 수에 순번을 나타내는 숫자에 20을 곱하고, 뒤의 수에 순번을 나타내는 수를 더했습니다.  사실 20을 안 곱하고 11 이상의 수를 곱하면 됩니다.  한자리 수인 경우에는 순번을 나타내는 수에 20을 곱했습니다.  그리고 두 수를 단순 비교했습니다.

 

cmp 함수를 만들었다면, 다음에 할 일은 정렬 알고리즘을 적용하기만 하면 됩니다.  그러면 알아서 cmp 결과에 따라서 정렬이 될테니까요.

 

제가 작성한 소스입니다.  소스는 참고용으로 봐주세요.

//---------------------------------------------------
//    baekjoon #1755
//        - by Edan
//        - created at 2019-08-11
//---------------------------------------------------
#include <stdio.h>
#include <algorithm>

bool cmp(int a, int b)
{
    int ord[10] = { 10, 5, 9, 8, 3, 2, 7, 6, 1, 4 };
    int s = 0;
    a = (a>=10)?ord[a/10]*20 + ord[a%10]:ord[a]*20;
    b = (b>=10)?ord[b/10]*20 + ord[b%10]:ord[b]*20;
    return a<b;
}

int main()
{
    int n, m, v[100], cp=0;
    scanf("%d%d",&n,&m);
    for(int i=n;i<=m;i++) v[cp++]=i;
    std::sort(v, v+cp, cmp);
    for(int i=0;i<cp;i++)
    {
        printf("%d", v[i]);
        putchar((i%10==9)?'\n':' ');
    }
    if(cp%10) putchar('\n');
    return 0;
}
728x90

댓글