์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ/BOJ_Java

[BOJ/Step12] 2751 : ์ˆ˜ ์ •๋ ฌํ•˜๊ธฐ 2 (JAVA)

NaNaRin๐Ÿ™ƒ 2021. 1. 26. 22:30

www.acmicpc.net/problem/2751

 

2751๋ฒˆ: ์ˆ˜ ์ •๋ ฌํ•˜๊ธฐ 2

์ฒซ์งธ ์ค„์— ์ˆ˜์˜ ๊ฐœ์ˆ˜ N(1 โ‰ค N โ‰ค 1,000,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์—๋Š” ์ˆซ์ž๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ด ์ˆ˜๋Š” ์ ˆ๋Œ“๊ฐ’์ด 1,000,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ •์ˆ˜์ด๋‹ค. ์ˆ˜๋Š” ์ค‘๋ณต๋˜์ง€ ์•Š๋Š”๋‹ค.

www.acmicpc.net


๋ฌธ์ œ

N๊ฐœ์˜ ์ˆ˜๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ด๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

 

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์ˆ˜์˜ ๊ฐœ์ˆ˜ N(1 โ‰ค N โ‰ค 1,000,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์—๋Š” ์ˆซ์ž๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ด ์ˆ˜๋Š” ์ ˆ๋Œ“๊ฐ’์ด 1,000,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ •์ˆ˜์ด๋‹ค. ์ˆ˜๋Š” ์ค‘๋ณต๋˜์ง€ ์•Š๋Š”๋‹ค.

 

์ถœ๋ ฅ

์ฒซ์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ ๊ฒฐ๊ณผ๋ฅผ ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ถœ๋ ฅํ•œ๋‹ค.

 

์˜ˆ์ œ ์ž…๋ ฅ 1

5 5 4 3 2 1

 

์˜ˆ์ œ ์ถœ๋ ฅ 1

1 2 3 4 5


ํ’€์ด

์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(nlogn)์ธ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ’€๋ผ๊ณ  ๋ช…์‹œ

=> ํ•ฉ๋ณ‘ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

=> ํž™ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

java
๋‹ซ๊ธฐ
import java.io.*; import java.util.Scanner; public class B2751 { โ€Œ โ€Œstatic int[] buff; โ€Œ โ€Œstatic void mergeSort(int[] a, int left, int right) { โ€Œโ€Œif(left < right) { โ€Œโ€Œโ€Œint i; โ€Œโ€Œโ€Œint center = (left + right) /2; โ€Œโ€Œโ€Œint p = 0; โ€Œโ€Œโ€Œint j = 0; โ€Œโ€Œโ€Œint k = left; โ€Œโ€Œโ€Œ โ€Œโ€Œโ€ŒmergeSort(a, left, center); โ€Œโ€Œโ€ŒmergeSort(a, center + 1, right); โ€Œโ€Œโ€Œ โ€Œโ€Œโ€Œfor(i = left; i <= center; i++) โ€Œโ€Œโ€Œโ€Œbuff[p++] = a[i]; โ€Œโ€Œโ€Œwhile(i <= right && j < p) โ€Œโ€Œโ€Œโ€Œa[k++] = (buff[j] <= a[i]) ? buff[j++] : a[i++]; โ€Œโ€Œโ€Œโ€Œโ€Œ โ€Œโ€Œโ€Œwhile(j < p) โ€Œโ€Œโ€Œโ€Œa[k++] = buff[j++]; โ€Œโ€Œ} โ€Œ} โ€Œ โ€Œstatic void mergeSort(int[] a, int n) { โ€Œโ€Œbuff = new int[n]; โ€Œโ€ŒmergeSort(a, 0, n-1); โ€Œโ€Œbuff = null; โ€Œ} โ€Œ โ€Œstatic void swap(int[]a, int idx1, int idx2) { โ€Œโ€Œint t = a[idx1]; โ€Œโ€Œa[idx1] = a[idx2]; โ€Œโ€Œa[idx2] = t; โ€Œ} โ€Œ โ€Œstatic void downHeap(int[] a, int left, int right) { โ€Œโ€Œint temp = a[left]; โ€Œโ€Œint child; โ€Œโ€Œint parent; โ€Œโ€Œ โ€Œโ€Œfor(parent = left; parent <(right+1)/2; parent = child) { โ€Œโ€Œโ€Œint cl = parent * 2 +1; โ€Œโ€Œโ€Œint cr = cl + 1; โ€Œโ€Œโ€Œchild = (cr <= right && a[cr] > a[cl]) ? cr : cl; โ€Œโ€Œโ€Œif(temp >= a[child]) โ€Œโ€Œโ€Œโ€Œbreak; โ€Œโ€Œโ€Œa[parent] = a[child]; โ€Œโ€Œ} โ€Œโ€Œa[parent] = temp; โ€Œ} โ€Œ โ€Œstatic void heapSort(int[] a, int n) { โ€Œโ€Œfor(int i = (n-1)/2; i >= 0; i--) โ€Œโ€Œโ€ŒdownHeap(a, i, n - 1); โ€Œโ€Œ โ€Œโ€Œfor(int i = n-1; i > 0; i--) { โ€Œโ€Œโ€Œswap(a, 0, i); โ€Œโ€Œโ€ŒdownHeap(a, 0, i-1); โ€Œโ€Œ} โ€Œ} โ€Œpublic static void main(String[] args) throws IOException { โ€Œโ€ŒScanner sc = new Scanner(System.in); โ€Œโ€ŒBufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); โ€Œโ€Œ โ€Œโ€Œint n = sc.nextInt(); โ€Œโ€Œint[] sort = new int[n]; โ€Œโ€Œ โ€Œโ€Œfor(int i = 0; i < n; i++) { โ€Œโ€Œโ€Œsort[i] = sc.nextInt(); โ€Œโ€Œ} โ€Œโ€Œ โ€Œโ€ŒmergeSort(sort, n); // ํ•ฉ๋ณ‘ ์ •๋ ฌ โ€Œโ€Œ//heapSort(sort, n); // ํž™ ์ •๋ ฌ โ€Œโ€Œ โ€Œโ€Œ โ€Œโ€Œfor(int i = 0; i < n; i++) { โ€Œโ€Œโ€Œbw.write(Integer.toString(sort[i]) +"\n"); โ€Œโ€Œ} โ€Œโ€Œbw.flush(); โ€Œ} }