반응형
문제 출처 :
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 |