1. ๋ฌธ์ ์ค๋ช ๐
1์ฐจ์ ๋ฐฐ์ด์ด ์ฃผ์ด์ง๊ณ , ํด๋น ๋ฐฐ์ด์ ๋ฒ๋ธ ์ ๋ ฌ๋ก ์ ๋ ฌํ๋ค๊ณ ํ์๋, ์ ์ฒด ๊ณผ์ ์ค์์ swap์ ๋ช ๋ฒ ์ผ์ด๋ฌ๋์ง ๊ตฌํ๋ผ.
2. ์ ๊ทผ ๋ฐฉ์ ๐๏ธ
Key Word
: Merge_sort
, Two Pointer
- ๋ถํ ์ ๋ณต, ํฌ ํฌ์ธํฐ๋ฅผ ํ์ฉํด ์ ๋ ฅ์ ๋ํด ๋ณํฉ ์ ๋ ฌ์ ์คํํ๋ค.
- ๋งค ์ฌ๊ท ์๊ฐ๋ง๋ค ์ ๋ ฌ์ด ๋ ํ ๋ฐ, ์ด๋ ์๋ฆฌ ๋ฐ๊ฟ์ด ์ผ์ด๋ ํ์๋ฅผ ์ผ๋ค.
- ์์ ๊ณผ์ ์์ ๊ตฌํ ์๋ฆฌ ๋ฐ๊ฟ ํ์๋ฅผ ๋์ ํด ์ถ๋ ฅํ๋ค.
์ ์ฒด ๊ณผ์ ์ ๊ฐ๋ตํ ์ค๋ช ํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
(1) ์ง๊ธ๋ถํฐ ๋ณํฉ ์ ๋ ฌ์ด ๋ฌด์์ธ์ง,
(2) ๋ฒ๋ธ ์ ๋ ฌ๋ก ์ ๋ ฌํ๋ผ ํ๋๋ฐ ์ ๋ณํฉ ์ ๋ ฌ์ ์ฌ์ฉํ๊ณ ๊ทธ๊ฒ์ด ํตํ๋์ง,
(3) ์ด๋ป๊ฒ ๊ตฌํํ๋ฉด ๋๋์ง
์ธ์ธํ๊ฒ ์ค๋ช ํ๊ฒ ๋ค.
(1) ๋ณํฉ ์ ๋ ฌ์ด ๋ฌด์์ธ์ง
๋ณํฉ์ ๋ ฌ์ ๋ถํ ์ ๋ณต
๊ณผ ํฌ ํฌ์ธํฐ
๋ฅผ ํ์ฉํด ๊ฐ๋ค์ ์ ๋ ฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ์ฌ๊ธฐ์ ๊ฐ๋จํ ์ค๋ช
ํ๊ณ ๋์ด๊ฐ๊ฒ ๋ค. ์์ธํ ์๊ณ ์ถ์ ๋ถ์ ๋ณํฉ ์ ๋ ฌ - geeksforgeeks์ ์์ธํ ์ค๋ช
๋์ด ์์ผ๋ ์ฐธ๊ณ ํ๊ธฐ ๋ฐ๋๋ค.
๋ณํฉ ์ ๋ ฌ์ ๋ค์๊ณผ ๊ฐ์ ์์๋ก ๊ตฌ๋ถ๋์ด ์๋ค.
- ์ ๋ ฌํด์ผํ ๊ฐ๋ค์ ๋ ์ด์ ์ชผ๊ฐค ์ ์์ ๋๊น์ง ๋ถํ ํ๋ค. (๋ถํ by ์ฌ๊ท)
- ๋ถํ ๋ ๊ฐ๋ค์ ์ธ์ ํ ๊ทธ๋ฃน๊ณผ ๋์๊ด๊ณ๋ฅผ ๋น๊ตํ์ฌ ์ ๋ ฌ ๋๋๋ก ํฉ์น๋ค. (์ ๋ณต by ํฌ ํฌ์ธํฐ)
๋ค์์ ๋น ์ ๋ ฌ๋ ๋ฐฐ์ด์ ๋ณํฉ ์ ๋ ฌ์ ์ด์ฉํด ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ ๊ณผ์ ์ ๋ณด๋ฉด์ ๋ณํฉ ์ ๋ ฌ์ ์ดํดํด๋ณด์.
a. ๋ถํ by ์ฌ๊ท
์ฌ๊ท๋ฅผ ํตํด, ๋ชจ๋ ๊ฐ์ ๋ ์ด์ ์ชผ๊ฐค ์ ์์ ๋๊น์ง ๋๋๋ค. ํด๋น ๋ฐฉ์์ ์์ฑ๋ ์ ์ฒด โ ๊ฐ๋ณ ๊ฐ์ฒด๊ฐ ๋๋ฏ๋ก top-down
๋ฐฉ์์ด๋ค. ์ ๋ณต์ bottom-up
๋ฐฉ์์ด๋ค.
b. ์ ๋ณต by ํฌ ํฌ์ธํฐ
์ฒซ ์ ๋ณต ๊ณผ์ ๋ถํฐ ์์ฑํด๋ณด์๋ค. ์ฐ๋ฆฌ๋ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ์ ๋ชฉํ๋ก ํ๊ณ ์์์ผ๋ก, ๋ ์ซ์์ ๋์ ๊ด๊ณ๋ฅผ ๋น๊ตํ๊ณ ์ ์ ํ ์์น๋ฅผ ๋ฐ๊พผ๋ค. ์ด๋ฐ ์์ผ๋ก ์์ ๋ฉ์ด๋ฆฌ๋ฅผ ํฉ์ณ๋๊ฐ๋ฉด ๊ฒฐ๊ตญ์๋ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ์ด ๋ ๊ฒ์ด๋ค. ์ด๋ ๊ฒ ์์ ๊ณผ์ ์ ๋ฐ๋ณต์ผ๋ก ์ ์ฒด๋ฅผ ๋ณํ์ํค๋ ๊ฒ์ ๋ถํ ์ ๋ณต
์ด๋ผ๊ณ ํ๋ค. ๊ทธ๋ผ ์ฌ๊ธฐ์ ํฌ ํฌ์ธํฐ
๋ ์ด๋ป๊ฒ ์ฐ์์๊น? ์์ ์ฒซ ์์๋ 1:1 ๋น๊ต๋ผ์ ํฌ ํฌ์ธํฐ๊ฐ ๊ผญ ํ์ํ์ง ์์ง๋ง ๋ค์๊ณผ ๊ฐ์ด ๊ทธ๋ฃน๊ณผ ๊ทธ๋ฃน ๊ฐ์ ๋น๊ต๋ผ๋ฉด ํ์ํด์ง๋ค.
๊ทธ๋ฃน๊ฐ์ ๋์๊ด๊ณ๋ฅผ ๋น๊ตํ๊ธฐ ์ํด์ L
ํฌ์ธํฐ์ R
ํฌ์ธํฐ๋ฅผ ๋ง๋ค์๋ค. ๋ ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ ๋น๊ตํ์ฌ ์์ ๊ฐ ์์ผ๋ก E ํฌ์ธํฐ์ ๋ค์ด๊ฐ๊ฒ ๋๋ค. ์ฌ์ฉํ ํฌ์ธํฐ๋ ๋ค์ ์ซ์๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ํ๋ค.
1๊ณผ 5๋ฅผ ๋น๊ตํ์ ๋, 1์ด ์์์ผ๋ก ํฉ์น ๋ฐฐ์ด์ ์์นธ์ ์ฑ์ด๋ค. ์ดํ Rํฌ์ธํฐ๋ ์์ผ๋ก ์์ง์ด๊ณ , E๋ ๊ฐ์ด ์ฐผ์ผ๋, ํ ์นธ ์์ผ๋ก ์ ์งํด์ผ ํ๋ค. ์ด๋ฐ์์ผ๋ก ํ๋ฉด,
์ด๋ ๊ฒ ์ ๋ ฌ๋ ๊ฒ์ด๋ค. ์ ์ฒด ์ ๋ ฌ ๊ณผ์ ์ ์ดํด๋ณด๋ฉด,
์ด๋ ๊ฒ ๋ ๊ฒ์ด๋ค. ๋ณํฉ ์ ๋ ฌ์ ์ดํดํ์ผ๋ ๋ค์์ผ๋ก ๋์ด๊ฐ์.
(2) ์ ๋ณํฉ ์ ๋ ฌ์ ์ฌ์ฉํ๊ณ ๊ทธ๊ฒ์ด ํตํ๋๊ฐ?
a. ์ ๋ณํฉ ์ ๋ ฌ ์ฌ์ฉ?
๋ฒ๋ธ ์ ๋ ฌ์ ์๊ฐ ๋ณต์ก๋๊ฐ O(\(N^{2})\) ์ด๋ผ N <= 500,000์ธ ๋ฌธ์ ์ ์กฐ๊ฑด์ ์๊ฐ ์ด๊ณผ๊ฐ ๋๋ค. ๋ฐ๋ฉด, ๋ณํฉ ์ ๋ ฌ์ ์ฑ์ง์ด ๋ฒ๋ธ ์ ๋ ฌ๊ณผ ์ ์ฌํ๋ฉด์๋ ์๊ฐ ๋ณต์ก๋๋ O(NlogN)์ด ๋ค์ด ์๊ฐ ์์ ๋ฌธ์ ๋ฅผ ํ ์ ์๋ค.
๋ ์ฌ์ด์ ์ด๋ค ์ ์ด ์ ์ฌํ ๊น?
๊ณตํต์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ๊ฐ ์์๊ฐ ๋์๊ด๊ณ ๋น๊ต๋ฅผ ํตํด ์๋ฆฌ๋ฅผ ์ด๋ํ๋ค.
- ๋ฐ๋ณต๋ฌธ ๋ง๋ค ๊ฐ ์์๊ฐ ์ผ๋ง๋ ์์ง์๋์ง ํ์ธ์ด ๊ฐ๋ฅํ๋ค
์์ ์์๋ก ์ด 7 2 4 6 5 3 1
์ ๋ฒ๋ธ ์ ๋ ฌ๋ก ์ ๋ ฌํ๊ณ , ๊ทธ๋๋ง๋ค ๋ช ๋ฒ์ swap์ด ์์๋์ง ์ฒดํฌํด๋ณด๊ฒ ๋ค.
์์ ๊ฐ์ด, ๋งค ๋ฐ๋ณต๋ฌธ๋ง๋ค ๋ช ๋ฒ์ ์์ง์์ด ์์๋์ง ํ์ธ ๊ฐ๋ฅํ๋ค. ์ฐจ์ด์ ์ด ์๋ค๋ฉด ๋ฒ๋ธ ์ ๋ ฌ์ ๊ฒฝ์ฐ ํ ๋ฐ๋ณต๋ฌธ์์ ํ๋์ ์๋ง ์์ง์ธ๋ค.
๋ฐ๋ฉด ๋ณํฉ ์ ๋ ฌ์ ํ๋์ ์ฌ๊ท์์ ์ฌ๋ฌ ์๊ฐ ๋์์ ์์ง์ธ๋ค.
์ด๋ค.
b. ์ ๋ณํฉ ์ ๋ ฌ์ด ํตํจ?
๋์ ์๋๋ฐฉ์์ ๋ฌ๋ผ๋ ์์ ๊ฐ์ ์๋ฆฌ๋ฅผ ๊ต์ฒดํ๋ ๊ธฐ์ค๊ณผ ๋งค ์๊ฐ ์์ง์ ํ์๋ฅผ ์ ์ ์๋ค๋ ์ฑ์ง์ด ๊ฐ๊ธฐ์ , ์ดํฉ๋ง ๊ตฌํ๋ฉด ๋๋ ์ฐ๋ฆฌ ์ ์ฅ์์๋ *์๋๊ฐ ๋น ๋ฅธ ๋ณํฉ ์ ๋ ฌ์ ํ์ฉํด * ์ดํฉ๋ง ๊ตฌํ๋ฉด ๋๋ ๊ฒ์ด๋ค.
๊ทธ๋์ ์ด๋ป๊ฒ ๊ตฌํํ๋ฉด ๋จ?
a. swap ํ๋ค.
์ ๊ธฐ์ค์ ์ก์์ผ ํ๋ค.
๋ฒ๋ธ ์ ๋ ฌ ์์์ Loop 1์ ๋ด๋ Swap์ ์ธ๋ ์๊ฐ์ ๋ฐ๋ผ '7์ด ์ค๋ฅธ์ชฝ์ผ๋ก 6๋ฒ swap ํ๋ค.' ์ '1,2,3,4,5,6์ด ์ผ์ชฝ์ผ๋ก ๊ฐ๊ฐ 1๋ฒ์ฉ swapํ๋ค.' ๋๊ฐ์ง ์๊ฐ์์ ๋ณผ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ง์ ํ์ด์์ ํ์๋ฅผ ์ ํํ์ง๋ง, ํ์์ ๊ฒฝ์ฐ ๊ทธ๊ฒ์ด ์ง๊ด์ ์ด์ง ์์์, ์ ์๋ฅผ ํํ๋ค. ๋ฐ๋ผ์ ์ด๋ฒ ํ์ด์์๋ ์ซ์์ ์ค๋ฅธ์ชฝ ์ด๋์ swap์ ๊ธฐ์ค์ผ๋ก ์ก๊ฒ ๋ค.
(์์ - 7์ด 6๋ฒ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋ == 7์ด 6๋ฒ swap)
b. ํญ์ ์์๊ฐ ์ด์ ์์น
์์ ์ผ๋ง๋ ์์ง์๋์ง๋ก swap ํ์๋ฅผ ์ฒดํฌํด์ผ ํ๋ค.
๋ง์ ์ฌ๋๋ค์ด ์์์ ์ต์ด ์์น์์ ๊ฐ ์ฌ๊ท๋ง๋ค ์์๊ฐ ์ผ๋ง๋ ์์ง์๋์ง๋ฅผ ์ฒดํฌํ๋ ์ค์๋ฅผ ํ๋ค. ์ ๋ฒ๋ธ ์ ๋ ฌ์ ์์๋ฅผ ๋ด๋ผ. 6์ ์ค์ ๋ก 3๋ฒ ์ด๋ํ์ง๋ง, ์ต์ด ์์น์ ๋น๊ตํ๋ฉด 2๋ฒ๋ฐ์ ์์ง์ด์ง ์์๋ค. ์ด๋ ๋ค์ ์๋ ์๊ฐ ์์ผ๋ก ์ค๋ฉด์ ๊ทธ ์ฌํ๋ก ๋ชจ๋ ์์ ์์น๊ฐ ๋ฌ๋ผ์ก๊ธฐ ๋๋ฌธ์ด๋ค.
์์ ๋ณ ์ด์ ์์น ๊ธฐ์ต์ ์ํด Node Class๋ฅผ ๋ง๋ค๊ณ ํด๋น ๊ฐ์ฒด์ ์ด์ ์์น(prev_index)์ ๊ฐ(v)์ ์ ์ฅํ๊ฒ ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด์ ์์น์ ๋น๊ตํด ์ค๋ฅธ์ชฝ์ผ๋ก ์ฎ๊ฒจ์ก์ผ๋ฉด ๊ทธ ๊ฐญ์ฐจ๋ฅผ swap_cnt์ ๋ํ๋ฉด ๋๋ค.
์์ ๊ทธ๋ฆผ์์ ๊ฐ๋ก์ถ์ ํ๋์ ์ฌ๊ท๋ก ๋ณด์์ ๋, ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋ํ ๊ฐ๊ณผ ์ด๋ ์ ๊ณผ์ ๊ฒฉ์ฐจ๋ฅผ ๊ธฐ๋กํ์๋ค.
3. ์ฝ๋ ์๊ฐ ๐
import java.io.*;
import java.util.StringTokenizer;
public class Main {
/*
* ๋ณํฉ์ ๋ ฌ์ ๋ฒ๋ธ์ ๋ ฌ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ธ์ ํ ์์๋ค๊ฐ์ ๋์๊ด๊ณ๋ฅผ ๋น๊ต ํ ์์น๋ฅผ ๋ณ๊ฒฝํ๋ค.
* ๋ณํฉ์ ๋ ฌ์ ์ด์ฉํด ๋ฒ๋ธ์ ๋ ฌ์ swap ํ์๋ฅผ ์ธ๋ ๊ฒ์, ๋ณํฉ ์ ๋ ฌ์ ์งํํ๋ ๋งค ํ์ฐจ๋ง๋ค,
* ์์๋ค์ด ์ผ๋ง๋ ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ์์ง์๋์ง, ๊ทธ ํ์๋ฅผ ์ธ์ด์ฃผ๋ฉด ๋๋ค.
*
* ๋ฐ๋ผ์ Node๋ผ๋ Class๋ฅผ ๋ง๋ ๋ค. ํด๋น Node๋ ์ด์ index์ value๋ฅผ ์ ์ฅํ๋ค.
* ํ index - ์ด์ index๊ฐ ์์์ธ ๊ฒฝ์ฐ ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋ํ ๊ฒ์์ผ๋ก, ๊ทธ ์ฐจ์ด๋ฅผ swap_cnt์ ์ธ์ด์ค๋ค.
* */
static int N;
static long swap_cnt = 0;
static Node [] arr;
static Node [] temp;
public static void main(String[] args) throws IOException {
// 1. ์
๋ ฅ ๋ฐ๊ธฐ
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
arr = new Node[N];
temp = new Node[N];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
arr[i] = new Node(i, Integer.parseInt(st.nextToken()));
}
// 2. ๊ณ์ฐ
merge_sort(0, N-1);
// 3. ์ถ๋ ฅ
System.out.println(swap_cnt);
}
public static void merge_sort(int start, int end){
// 0. ๊ธฐ์ ์กฐ๊ฑด
if(start == end) return;
// 1. ์ฌ๊ท
int mid = (start+end)/2;
merge_sort(start, mid);
merge_sort(mid+1, end);
// 2. ๊ณ์ฐ
// (1) ์์๋ก ๊ฐ์ ์ ์ฅํ๋ ๋ฐฐ์ด temp์ ๊ฐ ์ง์ด๋ฃ๊ธฐ
for(int i = start; i <= end; i++){
temp[i] = arr[i];
}
// (2) while๋ฌธ๊ณผ ํฌ์ธํฐ๋ฅผ ํ์ฉํ ์ ๋ ฌ
int E = start; int L = start; int R = mid+1;
while (L <= mid && R <= end){
// a. ๋์๊ด๊ณ ๋น๊ต ํ ์ ์ ํ ์์น์ ๋ฃ์ด์ฃผ๊ธฐ
if(temp[L].v > temp[R].v){
arr[E] = temp[R++];
}else {
arr[E] = temp[L++];
// ์์ผ๋ก ์ ์งํ๋ค๋ฉด swap ์งํํ ๊ฒ์์ผ๋ก, ํด๋น ๊ฐญ์ฐจ๋ฅผ swap_cnt์ ๋ํด์ฃผ๊ธฐ
if(arr[E].prev_idx < E) swap_cnt += E - (long) arr[E].prev_idx;
}
// ๋ชจ๋ ํ์ฌ index๋ฅผ ์ด์ index๋ก ๋ฃ์ด์ฃผ๊ธฐ
arr[E].prev_idx = E;
E++;
}
// (3) ์ ๋ ฌ ํ ๋จ์ ๊ฐ๋ค ๋ค์ ์ง์ด๋ฃ์ด์ฃผ๊ธฐ
if(L <= mid){
while (L <= mid){
arr[E] = temp[L++];
if(arr[E].prev_idx < E) swap_cnt += E - (long)arr[E].prev_idx;
arr[E].prev_idx = E;
E++;
}
}
}
}
class Node {
int prev_idx;
int v;
public Node (int prev_idx, int v) {
this.prev_idx = prev_idx;
this.v = v;
}
}
2๋ฒ ๊ณ์ฐ์ (3) ๋จ์ ํฌ ํฌ์ธํฐ ์ ๋ ฌ ํ ์์ง ๋จ์ ๊ฐ๋ค์ ๋ฐฐ์ด์ ์ฐจ๋ก๋๋ก ๋ฃ๊ธฐ์์ R ํฌ์ธํฐ ๊ทธ๋ฃน์์๋ ๋จ๋ ๊ฒ ์์ํ ๋ฐ ๋ฐ๋ก ์ ์ฒด ๋ฐฐ์ด์ธ arr์ ๋ฃ์ง ์๊ณ ์๋ค. ๊ทธ ์ด์ ๋ ์ด๋ฏธ ์ ์ฒด ๋ฐฐ์ด arr๊ฐ mid๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ์ด ๋ ์ํ๋ค. R ํฌ์ธํฐ ๊ทธ๋ฃน์ ๊ฐ์ด ๋จ์์๋ค๋ฉด ๋ค๋ฅธ ์๋ค๋ณด๋ค ์ปค์ ์๊ธฐ ์๋ฆฌ ๊ทธ๋๋ก ์งํจ ๊ฒฝ์ฐ๋ฅผ ๋ปํ๋ค. ๋ฐ๋ผ์ ์ ๋ ฌ์ ๋ฐ๋ก ํด์ค ํ์ ์์ด ์ ๋ ฌ๋์ด ์๋ค.
4. ๋ฐฐ์ด ๊ฒ๋ค ๐ฏ
์ ๋ฒ์ ํ ๋ ํผ์ ํ์๋ ๊ฒ ๊ฐ์๋ฐ, ์ด๋ฒ์ ๋ค๋ฅธ ์ฌ๋๋ค์ ํ์ด์ ๋ด ์ด์ ๋ต์์ ์ฐธ๊ณ ํ๋ค. ์ด์ ํ์ด๊ฐ ๋ ๊น๋ํ ๊ฒ์ ์ข์ ํ๋ค... ๋ก์คํธ ํ ํฌ๋๋ก์ง๊ฐ ์ด๋ก ์ ๊ฐ๋ฅํ๊ฐ ์ถ์์ง๋ง ๊ฐ๋ฅํ๊ตฌ๋...