반응형

문제 출처 :


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



알고리즘 분석 :


문제 해결에 필요한 사항

1. 정렬


문제 이해가 처음에는 조금 어려울 지 모르나 직접 수를 넣어보며 문제를 생각해본다면 이해 할 수 있다.


예제 입력에 없는 내용으로 한번 생각해보자.


5
600 200 300 400 500


일때 어떻게 될까?


답은 4 0 1 2 3 이다.


왜 이렇게 나오는지 답을 한번 구해보자.

B[P[i]] = A[i] 라는 식을 이용하여 아래처럼 표현 할 수 있다.


B[] = 600

B[] = 200

B[] = 300

B[] = 400

B[] = 500


이때 B에 index를 부여해보자.


B[0] = 600

B[1] = 200

B[2] = 300

B[3] = 400

B[4] = 500


이후 B의 값을 기준으로 정렬을 한번 해 보자.


B[1] = 200

B[2] = 300

B[3] = 400

B[4] = 500

B[0] = 600


이 값에 대해 정답이 되는 index를 한번 더 부여해보자.


B[1,0] = 200

B[2,1] = 300

B[3,2] = 400

B[4,3] = 500

B[0,4] = 600


이제 마지막으로 다시 원래대로 돌아가기 위해 B의 첫번째 값을 기준으로 정렬해보자.


B[0,4] = 600

B[1,0] = 200

B[2,1] = 300

B[3,2] = 400

B[4,3] = 500


이렇게 한다면 두번째 값에 정답이 나와있음을 알 수 있다.





소스 코드 : 


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
51
52
#include <iostream>
#include <cstdio>
#include <algorithm>
 
using namespace std;
 
typedef struct _INFO_
{
    int idx;
    int ans;
    int val;
}INFO;
 
INFO info[1002];
 
bool compVal(const INFO &a, const INFO &b)
{
    if(a.val != b.val) // 사전 순 정렬
        return a.val < b.val;
    return a.idx < b.idx;
}
 
bool compIdx(const INFO &a, const INFO &b)
{
    return a.idx < b.idx;
}
int main()
{
    int n;
    scanf("%d"&n);
 
    for (int i = 0; i < n; i++)
    {
        scanf("%d"&info[i].val);
        info[i].idx = i;
    }
 
    sort(info, info + n, compVal);
 
    for (int i = 0; i < n; i++)
        info[i].ans = i;
 
    sort(info, info + n, compIdx);
 
    for (int i = 0; i < n; i++)
        printf("%d ", info[i].ans);
 
    return 0;
}
 
//                                                       This source code Copyright belongs to Crocus
//                                                        If you want to see more? click here >>
Crocus


반응형

'Applied > 알고리즘 문제풀이' 카테고리의 다른 글

[1915번] 가장 큰 정사각형  (0) 2017.04.26
[1213번] 팰린드롬 만들기  (0) 2017.04.26
[2038번] 골롱 수열  (2) 2017.04.25
[2293번] 동전 1  (0) 2017.04.25
[2143번] 두 배열의 합  (2) 2017.04.25