본문 바로가기

알고리즘/Baekjoon

구간 트리. [1517]

[1. 문제 설명]

 

1 1 2 3 5 정렬 된 상태
3 2 1 5 1 최초 상태
2 3 1 5 1 3, 2 swap
2 1 3 5 1 3, 1 swap
2 1 3 1 5 5, 1 swap
1 2 3 1 5 2, 1 swap
1 2 1 3 5 3, 1 swap
1 1 2 3 5 2, 1 swap

3 이 3번의 swap 을 유도하고,

5 가 1번의 swap

2 가 2번의 swap

 

총 6번의 swap 이 발생하였다.


[2. 풀이 접근]

이해가 된 부분 까지만 정리 하도록

 

swap 의 주체는 인접한 두 값 중 큰 값 이다.

예를들어, 3 과 2 의 swap 이 발생 했을 때,

3 입장에서 한번 swap,

2 입장에서 한번 swap, 총 2번의 swap 이 발생과 같은 중복 처리는 있어선 안된다.

 

3 이 2 를 swap 하는 것이고,

2 는 3에 의해 swap 되는 것이다.

 

즉, 작은 수는 큰 수에 의해 swap 된다.

 

원래 배열을 정렬 한 상태에서 시작한다.

단, 정렬 했을 때 각 값이 원래 배열에서 위치한 index 를 알아둘 필요가 있다.

 

원래 배열에서 각 구간에서 정렬 된 개수를 저장하는 구간 트리를 하나 만든다.

최초 구간 트리 내 모든 값은 0 이다.

(버블 정렬 시작 전, 정렬 된 개수는 0 개이므로)

 

최초 1 은 원래 배열에서 index: 2 이다.

index 2 이후로 정렬 된 개수는 0 개 이다.

index 2 가 정렬 되었다고 구간 트리를 업데이트 한다.

 

그 다음 1 은 원래 배열에서 index: 4 이다.

index 4 이후로 정렬 된 개수는 0 개 이다.

index 4 가 졍렬 되었다고 구간 트리를 업데이트 한다.

 

그 다음 2 는 원래 배열에서 index: 1 이다.

index 1 이후로 정렬 된 개수는 총 2개이다.

index 1 이 정렬 되었다고 구간 트리를 업데이트 한다.

 

3 은 원래 배열에서 index: 1 이며, 이 이후로 정렬 된 개수는 총 3개 이다.

구간 트리 업데이트

 

5 는 원래 배열에서 index: 4 이며, 이 이후로 정렬 된 개수는 총 1개 이다.

구간 트리 업데이트

 

정렬 된 배열 순회를 완료하였다.

 

총 6번의 swap 이 발생하였음을 알 수 있다.

 

가장 작은 수 1 은 swap 의 주체가 아니므로, swap 수가 세어져서는 안된다.

최초 구간 트리 내 모든 노드의 값은 0 이므로 이러한 조건을 충족시킨다.


[3. 코드]

 

 

'알고리즘 > Baekjoon' 카테고리의 다른 글

구간 트리. [16975]  (0) 2022.11.01
구간 트리. [9345]  (0) 2022.10.31
구간 트리. [2357]  (0) 2022.10.29
구간 트리. [11505]  (1) 2022.10.29
구간 트리. [2042]  (0) 2022.10.27