본문 바로가기

C++/백준

[C++][백준][정렬] 1015 수열 정렬

https://www.acmicpc.net/problem/1015

 

1015번: 수열 정렬

P[0], P[1], ...., P[N-1]은 0부터 N-1까지(포함)의 수를 한 번씩 포함하고 있는 수열이다. 수열 P를 길이가 N인 배열 A에 적용하면 길이가 N인 배열 B가 된다. 적용하는 방법은 B[P[i]] = A[i]이다. 배열 A가 주어졌을 때, 수열 P를 적용한 결과가 비내림차순이 되는 수열을 찾는 프로그램을 작성하시오. 비내림차순이란, 각각의 원소가 바로 앞에 있는 원소보다 크거나 같을 경우를 말한다. 만약 그러한 수열이 여러개라면 사전순

www.acmicpc.net

문제

P[0], P[1], ...., P[N-1]은 0부터 N-1까지(포함)의 수를 한 번씩 포함하고 있는 수열이다. 수열 P를 길이가 N인 배열 A에 적용하면 길이가 N인 배열 B가 된다. 적용하는 방법은 B[P[i]] = A[i]이다.

배열 A가 주어졌을 때, 수열 P를 적용한 결과가 비내림차순이 되는 수열을 찾는 프로그램을 작성하시오. 비내림차순이란, 각각의 원소가 바로 앞에 있는 원소보다 크거나 같을 경우를 말한다. 만약 그러한 수열이 여러개라면 사전순으로 앞서는 것을 출력한다.

입력

첫째 줄에 배열 A의 크기 N이 주어진다. 둘째 줄에는 배열 A의 원소가 0번부터 차례대로 주어진다. N은 50보다 작거나 같은 자연수이고, 배열의 원소는 1,000보다 작거나 같은 자연수이다.

출력

첫째 줄에 비내림차순으로 만드는 수열 P를 출력한다.

예제 입력 

3 2 3 1

예제 출력 

1 2 0

 

문제를 이해하는데 시간이 걸려 여러번 시도했던 문제이다.

배열 A를 입력받고 A[i]보다 큰 원소의 개수를 구해서 P[i]에 저장한다.

수열 P를 적용한 결과가 비내림차순이 되는데 만약에 여러개라면 사전순으로 앞서는 것을 출력해주어야한다.

그래서 앞의 원소와 같은 숫자일 경우 뒤의 P[i]에 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
#include <stdlib.h>
#include <stdio.h>
 
int main(){
    int N;
    int A[51],P[51]={-1,};
    scanf("%d"&N);
 
    for(int i=0; i<N; i++)
        scanf("%d"&A[i]);
 
    for (int i=0; i<N; i++){
        P[i] = 0;
        // A[i]보다 큰 수의 개수 구해서 P[i]에 저장
        for (int j=0; j<N; j++)
            if (A[j] > A[i])
                P[j]++;
        //같은 수일 경우
        while(true){
            bool flag = false;
                for (int k=0; k<N; k++)
                    if (i!=&& i>&& P[i]==P[k]){
                        P[i]++;
                        flag = true;
                    }
                if (flag==false)
                    break;
        }
    }
 
    for(int i=0; i<N; i++)
        printf("%d ", P[i]);
    printf("\n");
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter