//BAEKJOON 1071
//아무리 생각해도 많조분이 아닌데 많조분으로 푸는 나...
#include <stdio.h>
#include <algorithm>
using namespace std;

int n, cnt, arr[1010], idx[55];

int main() {

    scanf("%d", &n);

    for(int i=0; i<n; i++) {
        int k;
        scanf("%d", &k);
        if(arr[k]==0) {
            idx[cnt++]=k;
        }
        arr[k]++;
    }

    sort(idx, idx+cnt);

    int last=-2;// 수열 마지막 숫자

    for(int i=0; i<cnt;) {
        int s=idx[i], m=idx[i+1], e=idx[i+2];
        int flag=1; //flag : 예외처리 했으면 flag=0
        if(i+1==cnt) { //남은 개수 
            for(int j=0; j<arr[s]; j++) {
                printf("%d ", s);
            }
            flag=0;
            i++;
        }
        else if(i+2==cnt) { //남은 개수 2
            if(m-s==1) {
                for(int j=0; j<arr[m]; j++) printf("%d ", m);
                for(int j=0; j<arr[s]; j++) printf("%d ", s);
            }
            else if(s-last==1) {
                printf("%d ", m); arr[m]--;
                for(int j=0; j<arr[s]; j++) printf("%d ", s);
                for(int j=0; j<arr[m]; j++) printf("%d ", m);
            }
            else {
                for(int j=0; j<arr[s]; j++) printf("%d ", s);
                for(int j=0; j<arr[m]; j++) printf("%d ", m);
            }
            flag=0;  
            i+=2;
        }
        else if(i+3!=cnt) {
            if(idx[i+3]-idx[i+2]==1&&idx[i+1]-idx[i]!=1) { //남은 개수 4 이상, 특별한 경우
                if(s-last==1) {
                    printf("%d ", m); arr[m]--;
                    for(int j=0; j<arr[s]; j++) printf("%d ", s);
                    for(int j=0; j<arr[m]; j++) printf("%d ", m);
                }
                else {
                    for(int j=0; j<arr[s]; j++) printf("%d ", s);
                    for(int j=0; j<arr[m]; j++) printf("%d ", m);
                }
                if(arr[m]) last=m;
                else last=s;
                
                flag=0;
                i+=2;
            }
        }
        if(flag) { //3, 6 이상
            if(m-s==1) {
                if(e-m==1) { // s, e, m 다 1 차이
                    if(s-last==1) { //전 숫자랑 1 차이
                        printf("%d ", m); arr[m]--;
                        for(int j=0; j<arr[s]; j++) printf("%d ", s);
                        
                        if(i+4==cnt && idx[i+3]-idx[i+2]==1) {
                            if(arr[m]) i++;
                            else i+=2;

                            last=s;
                        }
                        else {
                            for(int j=0; j<arr[e]; j++) printf("%d ", e);
                            for(int j=0; j<arr[m]; j++) printf("%d ", m);
                       
                            if(arr[m]) last=m;
                            else last=e;
                            
                            i+=3;
                        }
                    }
                    else {
                        if(i+3==cnt) {
                            for(int j=0; j<arr[s]; j++) printf("%d ", s);
                            for(int j=0; j<arr[e]; j++) printf("%d ", e);
                            for(int j=0; j<arr[m]; j++) printf("%d ", m);
                            i+=3;
                        }
                        else {
                            for(int j=0; j<arr[s]; j++) printf("%d ", s);
                            printf("%d ", e); arr[e]--;
                            for(int j=0; j<arr[m]; j++) printf("%d ", m);
                            
                            if(arr[e]) i+=2;
                            else i+=3;
                        }
                        last=m;
                    }
                }
                else { // s, m만 1 차이
                    if(s-last==1) { //전 숫자랑 1 차이
                        if(i+4==cnt && idx[i+3]-idx[i+2]==1) {
                            printf("%d ", m); arr[m]--;
                            for(int j=0; j<arr[s]; j++) printf("%d ", s);

                            if(arr[m]) {
                                printf("%d ", e); arr[e]--;
                                for(int j=0; j<arr[m]; j++) printf("%d ", m);

                                if(arr[e]) i+=2;
                                else i+=3;
                            }
                            else {
                                i+=2;
                            }
                            last=m;
                        }
                        else {
                            printf("%d ", m); arr[m]--;
                            for(int j=0; j<arr[s]; j++) printf("%d ", s);
                            printf("%d ", e); arr[e]--;
                            for(int j=0; j<arr[m]; j++) printf("%d ", m);

                            if(arr[m]) last=m;
                            else last=e;
                            
                            if(arr[e]) i+=2;
                            else i+=3;
                        }
                    }
                    else {
                        if(i+3==cnt) {
                            for(int j=0; j<arr[s]; j++) printf("%d ", s);
                            printf("%d ", e); arr[e]--;
                            for(int j=0; j<arr[m]; j++) printf("%d ", m);
                            for(int j=0; j<arr[e]; j++) printf("%d ", e);
                            //7,8,8,10,10 -> 7 10 8 8 10
                        
                            if(arr[e]) last=e;
                            else last=m;
                            
                            i+=3;
                        }
                        else {
                            for(int j=0; j<arr[s]; j++) printf("%d ", s);
                            printf("%d ", e); arr[e]--;
                            for(int j=0; j<arr[m]; j++) printf("%d ", m);

                            last=m;
                            
                            if(arr[e]) i+=2;
                            else i+=3;
                        }
                    }
                }
            }
            else if(e-m==1) { //m, e만 차이
                if(s-last==1) { //전 숫자랑 1 차이
                    printf("%d ", m); arr[m]--;
                    for(int j=0; j<arr[s]; j++) printf("%d ", s);
                    for(int j=0; j<arr[e]; j++) printf("%d ", e);
                    for(int j=0; j<arr[m]; j++) printf("%d ", m);

                    if(arr[m]) last=m;
                    else last=e;
                    i+=3;
                }
                else {
                    for(int j=0;j<arr[s]; j++) printf("%d ", s);
                    if(i+3==cnt) { //3개
                        for(int j=0; j<arr[e]; j++) printf("%d ", e);
                        for(int j=0; j<arr[m]; j++) printf("%d ", m);

                        i+=3;
                    }
                    else {
                        for(int j=0; j<arr[m]; j++) printf("%d ", m);
                        i+=2;
                    }
                    last=m;
                }
            }
            else { // s, e, m 다 2 이상
                if(s-last==1) { //전 숫자랑 1 차이
                    printf("%d ", m); arr[m]--;
                    for(int j=0; j<arr[s]; j++) printf("%d ", s);
                    for(int j=0; j<arr[m]; j++) printf("%d ", m);
                    for(int j=0; j<arr[e]; j++) printf("%d ", e);
                    // (5) 6,6,8,8,8,10 -> 8 6 6 8 8 10
                    
                    last=e;
                }
                else {
                    for(int j=0; j<arr[s]; j++) printf("%d ", s);
                    for(int j=0; j<arr[m]; j++) printf("%d ", m);
                    for(int j=0; j<arr[e]; j++) printf("%d ", e);
                    
                    last=e;
                }
                i+=3;
            }
        }
    }
}

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: