https://www.acmicpc.net/problem/1849
1849번: 순열
1부터 N까지의 수들이 한 번씩 쓰인 수열이 있다. 그 수열에서 i 앞에 있는 수 들 중, i보다 큰 수들의 개수를 A[i]라고 정의하자. A[i]가 주어져 있을 때, 원래 수열을 구하는 프로그램을 작성하여라
www.acmicpc.net
세그먼트 트리 문제다.
풀이
숫자 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 |