https://www.acmicpc.net/problem/1849
세그먼트 트리 문제다.
풀이
숫자 i 앞에 i보다 큰 숫자의 개수는 작은 수부터 탐색했을 때, 앞에 주어진 빈칸의 개수로 접근 가능하다. 트리의 리프가 1인 구간합 트리를 생성하여 해당 숫자가 몇 번째 숫자인지 뽑아내면 문제를 해결할 수 있게 된다. 수열 [2 4 3 1]의 경우로 시나리오를 작성하면 다음과 같다.
입력 예제 : 3 0 1 0
수열의 구간중 남아있는 공간의 수를 나타내는 세그먼트 트리 생성.
트리 초기화 및 입력값 저장. 순번으로 다루기 편하게 입력값을 +1 처리하여 저장한다.
가장 먼저 1의 인덱스를 찾는다. 남아 있는 공간 중 네 번째 공간의 인덱스를 탐색. 3이 반환된다. 해당 인덱스에 1 저장.
다음 탐색을 위해 방문했던 노드는 -1 처리한다.
2의 인덱스 탐색, 현재 남아있는 공간중 첫 번째 공간의 인덱스로 0이 반환된다.
3의 인덱스를 탐색, 현재 남아있는 공간중 두 번째 공간의 인덱스인 2가 반환된다
마지막으로 4의 인덱스 탐색. 남아있는 공간중 첫 번째 공간, 즉 유일하게 남아있는 공간의 인덱스를 반환하여 수열을 완성하면 된다.
정답 코드
'Problem Solving > BOJ' 카테고리의 다른 글
[1280] 나무 심기 (1) | 2023.03.09 |
---|---|
[1725] 히스토그램 (0) | 2023.03.07 |
[1517] 버블 소트 (0) | 2023.03.02 |
[1572] 중앙값 (0) | 2023.03.01 |
[1321] 군인 (0) | 2023.02.28 |