๐ ๋ณํฉ์ ๋ ฌ
๋ถํ ์ ๋ณต ๋ฐฉ์์ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ ๋ถํ ํ๊ณ ๋ถํ ํ ์งํฉ์ ์ ๋ ฌํ๋ฉฐ ํฉ์น๋ ์๊ณ ๋ฆฌ์ฆ
์๊ฐ ๋ณต์ก๋ ํ๊ท ๊ฐ์ O(nlogn)
๐ ๋ฒ๋ธ์ํธ - ๋ฐฑ์ค 1517
https://www.acmicpc.net/problem/1517
๋ฌธ์
N๊ฐ์ ์๋ก ์ด๋ฃจ์ด์ง ์์ด A[1], A[2], …, A[N]์ด ์๋ค. ์ด ์์ด์ ๋ํด์ ๋ฒ๋ธ ์ํธ๋ฅผ ์ํํ ๋, Swap์ด ์ด ๋ช ๋ฒ ๋ฐ์ํ๋์ง ์์๋ด๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
๋ฒ๋ธ ์ํธ๋ ์๋ก ์ธ์ ํด ์๋ ๋ ์๋ฅผ ๋ฐ๊ฟ๊ฐ๋ฉฐ ์ ๋ ฌํ๋ ๋ฐฉ๋ฒ์ด๋ค. ์๋ฅผ ๋ค์ด ์์ด์ด 3 2 1 ์ด์๋ค๊ณ ํ์. ์ด ๊ฒฝ์ฐ์๋ ์ธ์ ํด ์๋ 3, 2๊ฐ ๋ฐ๋์ด์ผ ํ๋ฏ๋ก 2 3 1 ์ด ๋๋ค. ๋ค์์ผ๋ก๋ 3, 1์ด ๋ฐ๋์ด์ผ ํ๋ฏ๋ก 2 1 3 ์ด ๋๋ค. ๋ค์์๋ 2, 1์ด ๋ฐ๋์ด์ผ ํ๋ฏ๋ก 1 2 3 ์ด ๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ ์ด์ ๋ฐ๊ฟ์ผ ํ ๊ฒฝ์ฐ๊ฐ ์์ผ๋ฏ๋ก ์ ๋ ฌ์ด ์๋ฃ๋๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ N(1 ≤ N ≤ 500,000)์ด ์ฃผ์ด์ง๋ค. ๋ค์ ์ค์๋ N๊ฐ์ ์ ์๋ก A[1], A[2], …, A[N]์ด ์ฃผ์ด์ง๋ค. ๊ฐ๊ฐ์ A[i]๋ 0 ≤ |A[i]| ≤ 1,000,000,000์ ๋ฒ์์ ๋ค์ด์๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ Swap ํ์๋ฅผ ์ถ๋ ฅํ๋ค
๐ ํต์ฌ ์์ด๋์ด
- N์ ๋ฒ์๊ฐ 1,000,000,000 ์ด๋ฏ๋ก ๋ฒ๋ธ์ํธ๊ฐ ์๋ O(nlogn)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง ๋ณํฉ ์ ๋ ฌ์ ์ฌ์ฉํด์ผ ํ๋ค.
- ๋ ๊ทธ๋ฃน์ ๋ณํฉ ํ๋ ๊ณผ์ ์์ swap์ด ์ผ์ด๋๋๋ฐ, ์ค๋ฅธ์ชฝ ์์ ๊ฐ์ด ์ผ์ชฝ๋ณด๋ค ํด ๋ index๊ฐ ์ด๋ํ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํด์ result์ ์ถ๊ฐํ๋ฉด ๋๋ค. (๋ณํฉ ์ ๋ ฌ ์ฝ๋์ ๊ฑฐ์ ๊ฐ์)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main{
public static int[] arr, tmp;
public static long result;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
arr = new int[N];
tmp = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i = 0; i < N; i++){
arr[i] = Integer.parseInt(st.nextToken());
}
mergeSort(0, N-1);
System.out.println(result);
}
public static void mergeSort(int start, int end){
if(start >= end) return;
int mid = (start + end)/2;
mergeSort(start, mid);
mergeSort(mid+1, end);
int L = start;
int R = mid + 1;
int point = start;
while(L <= mid || R <= end){
if(R > end||(L <= mid && arr[L] <= arr[R])){
tmp[point++] = arr[L++];
}
else{ // L > mid || R <= end && arr[L] > arr[R]
if(L <= mid && arr[L] > arr[R] && R <= end){ // ์ค๋ฅธ์ชฝ ๊ฐ์ด ์์ ๊ฒฝ์ฐ
result += R - point; // ์ถ์ํ ์ธ๋ฑ์ค๋งํผ result์ ์ถ๊ฐ
}
tmp[point++] = arr[R++];
}
}
for (int i = start; i < end + 1; i++) {
arr[i] = tmp[i];
}
}
}
์๋ ๋ณํฉ ์ ๋ ฌ ์ฝ๋์์ result ๋ถ๋ถ๋ง ์ถ๊ฐํด์ค ๊ฒ
https://www.acmicpc.net/problem/2751
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main{
public static int[] arr, tmp;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
arr = new int[N];
tmp = new int[N];
for(int i = 0; i < N; i++){
arr[i] = Integer.parseInt(br.readLine());
}
mergeSort(0, N-1);
StringBuilder sb = new StringBuilder();
for (int i : arr) {
sb.append(i).append("\n");
}
System.out.println(sb);
}
public static void mergeSort(int start, int end){
if(start >= end) return;
int mid = (start + end)/2;
mergeSort(start, mid);
mergeSort(mid+1, end);
int L = start;
int R = mid + 1;
int point = start;
while(L <= mid || R <= end){
// ์ค๋ฅธ์ชฝ์ด ์ด๋ฏธ ์ ๋ ฌ๋ ๊ฒฝ์ฐ ์ผ์ชฝ ์์๋ฅผ ์์ฐจ์ ์ผ๋ก ๋ค์ ์ ์ฅ
// ์์ชฝ์ ์์๊ฐ ๋จ์ ์์ผ๋ฉฐ ์ผ์ชฝ์ด ์ค๋ฅธ์ชฝ๋ณด๋ค ์์ ๋ ์ผ์ชฝ ์์ ์ ์ฅ
if(R > end||(L <= mid && arr[L] <= arr[R])){
tmp[point++] = arr[L++];
}
// L > mid || R<=end && arr[L] > arr[R]
else{
tmp[point++] = arr[R++];
}
}
for (int i = start; i < end + 1; i++) {
arr[i] = tmp[i];
}
}
}
์ฝํ ์ ๋ฆฌ ๊นํ๋ธ ๋งํฌ
GitHub - Suyoung225/JavaPrac: Java๋ก ๋ฐฑ์ค, ํ๋ก๊ทธ๋๋จธ์ค ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ์ด
Java๋ก ๋ฐฑ์ค, ํ๋ก๊ทธ๋๋จธ์ค ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ์ด. Contribute to Suyoung225/JavaPrac development by creating an account on GitHub.
github.com
'์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] ์ต์๊ณต๋ฐฐ์ - ๋ฐฑ์ค 1934 (JAVA) - ์ ํด๋ฆฌ๋ ํธ์ ๋ฒ (0) | 2023.01.05 |
---|---|
[BOJ] ๊ฑฐ์ ์์ - ๋ฐฑ์ค 1456 (์๋ฐ JAVA) - ์๋ผํ ์คํ ๋ค์ค์ ์ฒด (1) | 2023.01.04 |
[BOJ] DNA ๋น๋ฐ๋ฒํธ - ๋ฐฑ์ค 12891 (์๋ฐ JAVA)- ์ฌ๋ผ์ด๋ฉ ์๋์ฐ (0) | 2022.12.29 |
[BOJ] ๋๋จธ์ง ํฉ - ๋ฐฑ์ค 10986 (์๋ฐ JAVA) - ๊ตฌ๊ฐ ํฉ (0) | 2022.12.29 |
์๋ฐ ํ๋ณํ ์ ๋ฆฌ (0) | 2022.12.27 |
๋๊ธ