Home 소트(1071, P5, c++)
Post
Cancel

소트(1071, P5, c++)

소트

소트

문제

N개의 정수가 주어지면, 이것을 연속된 두 수가 연속된 값이 아니게 정렬(A[i] + 1 ≠ A[i+1])하는 프로그램을 작성하시오.
가능한 것이 여러 가지라면 사전순으로 가장 앞서는 것을 출력한다.

입력

첫째 줄에 N이 주어진다. N은 50보다 작거나 같은 자연수이다.
둘째 줄에는 N개의 수가 주어진다. N개의 수는 1,000보다 작거나 같은 자연수 또는 0이다.

출력

첫째 줄에 문제의 정답을 출력한다.

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
29
30
31
32
33
34
예제 입력 1 
3
1 2 3

예제 출력 1 
1 3 2

예제 입력 2 
9
1 1 1 1 2 2 2 2 2

예제 출력 2 
2 2 2 2 2 1 1 1 1

예제 입력 3 
2
1 2

예제 출력 3 
2 1

예제 입력 4 
6
1 2 3 4 5 6

예제 출력 4 
1 3 2 4 6 5

예제 입력 5 
6
1 1 2 2 3 3

예제 출력 5 
1 1 3 3 2 2

풀이

그리디..보다는 애드 훅 성향이라고 생각은 드는데 역시 codeforce 느낌이다.
뭔가 div2에서 어려운 B? C? 정도일 것 같아.

아이디어는 별거 없는데 일단 정렬을 한 후, v[i]+1 == v[i+1] 조건을 확인한다.
만약 조건에 해당된다면 뒤로 가면서 바꿀 수 있는 수를 찾아야 한다.
뒤로 이동하며 v[i+1]과 달라지는 수가 있으면 바꾸고, 없으면 맨 끝과 바꾼다.

1 1 1 2 2 2 같은 경우에는 이 과정을 한 번 하면 1 1 2 2 2 1 상태가 된다.
이러면 마지막 1은 고정된 값이 되기에 찾는 범위를 한칸 줄여주면 될 것 같다.
그래서 s_n이라는 변수를 만들어 n 값을 저장하고, 위의 case일 경우 s_n을 1씩 감소했다.

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
#include <vector>
#include <string>
#include <functional>
#include <stack>
#include <map>
#include <set>
#include <algorithm>
#include <math.h>
using namespace std;
int main()
{
    ios_base ::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int a, b, c;
    int n, m, t;
    
    cin >> n;
    vector<int> v(n);
    for(int i=0;i<n;i++){
        cin >> v[i];
    }
    sort(v.begin(), v.end());

    t=0;
    int s_n = n;
    for(int i=0;i<s_n-1;i++){
        if(v[i]+1 == v[i+1]){
            for(int j=i+1;j<s_n;j++){
                if(v[i+1]!=v[j]){
                    swap(v[i+1], v[j]);
                    i=-1;
                    break;
                }
                if(j==s_n-1){
                    swap(v[i], v[j]);
                    i=-1;
                    s_n--;
                }
            }
        }
    }
    for(int i=0;i<n;i++){
        cout << v[i] << ' ';
    }

    return 0;
}
This post is written by PRO.