더블릿
수(기타) 놀이터 | 문제 코너 | 제출 현황 | 수학 Q/A | 수학 quiz |

koi_run 대회 풀이

이 문제는 각 선수에 대해 앞에 있는 선수 중에 자신보다 실력이 좋은 선수의 수를 구하는 문제이다. 


이는 주어진 선수들의 능력의 배열을 병합정렬하면서 답을 구할 수 있다.


 정렬하고자 하는 배열을 두 배열로 나누고, 각각의 배열 내에서는 각 원소의 최선의 등수를 알고 있다고 가정한다. 이 조건을 만족하면 다음과 같은 알고리즘을 통해, 병합된 배열에서 각 원소의 최선의 등수를 알 수 있다.


 정렬하고자 하는 두 배열을 각각 A, B라고 하자. A의 맨 앞의 원소를 x, B의 맨 앞의 원소를 y라고 하자. 만약 x가 y보다 작으면, x를 A에서 제거하며 병합된 배열에 삽입한다. 

x는 B의 모든 원소보다 앞에 있으므로 x의 최선의 등수와 B는 관련이 없다. 만약 x가 y보다 크면, y를 B에서 제거하며 병합된 배열에 삽입한다. 

이 때 A 배열의 모든 원소는 y보다 항상 앞에 존재하므로 y의 최선의 등수는 B에서의 최선의 등수에 y보다 실력이 좋은 A의 원소들의 개수를 더한 값이다. 

여기서 y보다 큰 값들은 현재 배열 A에 남은 원소의 개수와 같다. 이 과정을 A와 B에 모든 원소가 빠질 때까지 반복한다. 이 작업이 완료되면 A와 B 배열이 합쳐진 상태로 정렬이 되며, 각 선수들의 최선의 등수까지 알 수 있다.


 입력 받은 배열은 정렬이 되지 않은 상태이다. 이 배열을 절반으로 나누고, 나누어진 배열 각각을 또다시 절반으로 나누고, 나누어진 배열들이 정렬이 모두 되었다면, 그것을 합해서 정렬된 상태로 만든다. 


배열의 원소가 1개이면 이미 배열이 정렬되었고 최선의 등수는 1등이다. 이 작업을 반복하여 전체 배열을 정렬하는 동시에 각 원소의 최선의 등수를 구할 수 있다. 


시간복잡도는 병합정렬과 같으므로  이다. 


1970:01:01 .. written by testid...[질/답]