๐Ÿ€ Knowledge/์•Œ๊ณ ๋ฆฌ์ฆ˜

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ์ •๋ ฌ(๋ณ‘ํ•ฉ, ๊ธฐ์ˆ˜) ์•Œ๊ณ ๋ฆฌ์ฆ˜ (3)

TIlearn 2023. 8. 18. 14:53

 

๋ณ‘ํ•ฉ ์ •๋ ฌ

 

๋ถ„ํ•  ์ •๋ณต, ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„ํ• ํ•˜๊ณ  ๋ถ„ํ• ํ•œ ์ง‘ํ•ฉ์„ ์ •๋ ฌํ•˜๋Š” ๋ณ‘ํ•ฉ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ •๋ ฌ ๋ฐฉ์‹์ด๋‹ค

ํŠน์ดํ•œ ์ ์€ swap์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์—ฌ๊ธฐ์„œ swap์ด๋ž€, ์ธ์ ‘ํ•œ ์š”์†Œ์™€ ๋น„๊ตํ•˜์—ฌ ๊ตํ™˜ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

 

๊ทธ๋Ÿผ ์–ด๋–ค ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ธธ๋ž˜ swap์„ ์“ฐ์ง€ ์•Š๊ณ ๋„ ์ •๋ ฌ์ด ๊ฐ€๋Šฅํ•œ ๊ฑธ๊นŒ?

๋ณ‘ํ•ฉ ์ •๋ ฌ์˜ ํ•ต์‹ฌ์€ ๋ณ‘ํ•ฉ์ด๋‹ค.  ์ด ๊ณผ์ •์—์„œ ์ •๋ ฌ์ด ๋˜๊ฒŒ๋” ์žฌ ์กฐํ•ฉํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์ง์ ‘ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉฐ, ์–ด๋– ํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ตฌ๋™๋˜๋Š” ์ง€ ์‚ดํŽด๋ณด์ž.

 

 

๋ณ‘ํ•ฉ ์ •๋ ฌ ๋ฌธ์ œ ํ’€์ด

 

๋ฐฑ์ค€ 2751๋ฒˆ ๋ฌธ์ œ๋ฅผ ํ†ตํ•ด ๋ณ‘ํ•ฉ ์ •๋ ฌ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

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

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

www.acmicpc.net

 

 

 

ํ•ด๋‹น ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ’€์ด์ด๋‹ค.

import java.util.*;
import java.io.*;
public class Main {
    public static int[] A, tmp;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int N = Integer.parseInt(br.readLine());

        A = new int[N+1];
        tmp = new int[N+1];

        for(int i=1; i<=N; i++) {
            A[i] = Integer.parseInt(br.readLine());
        }


        merge_sort(1, N);

        for(int i=1; i<=N; i++) {
            bw.write(A[i] + "\n");
        }
        bw.flush();
        bw.close();
    }

    public static void merge_sort(int s, int e) {
        if (e -s < 1) {
            return;
        }
        int m = s + (e-s)/2;

        merge_sort(s, m);
        merge_sort(m+1, e);
        for(int i=s; i<=e; i++) {
            tmp[i] = A[i];
        }

        int k=s;
        int index1 = s;
        int index2 = m+1;
        while(index1 <= m && index2 <= e) {
            if(tmp[index1] > tmp[index2]) {
                A[k] = tmp[index2];
                k++;
                index2++;
            } else {
                A[k] = tmp[index1];
                k++;
                index1++;
            }
        }

        while(index1 <= m) {
            A[k] = tmp[index1];
            k++;
            index1++;
        }
        while(index2 <= e) {
            A[k] = tmp[index2];
            k++;
            index2++;
        }

    }


}

 

 

์ฝ”๋“œ์—์„œ ํ•ต์‹ฌ์ ์ธ ๋ถ€๋ถ„์€ merge_sort๋ฉ”์„œ๋“œ ๋ถ€๋ถ„์ด๋‹ค.

ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋Š” ๋‘ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋‰  ์ˆ˜ ์žˆ๋‹ค. ํ•œ๋ฒˆ ๋ณ‘ํ•ฉ ์ •๋ ฌ์˜ ๊ฐœ๋…์„ ์ƒ๊ฐํ•ด๋ณด์ž.

 

๋ถ„ํ• ๊ณผ ์ •๋ณต

 

๋ฉ”์„œ๋“œ๋ฅผ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๋ฉด, ์žฌ๊ท€์ ์œผ๋กœ merge_sort๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
์—ฌ๊ธฐ์„œ ์ค‘๊ฐ„ ๊ฐ’ m์„ ๊ธฐ์ค€์œผ๋กœ ๋ถ„ํ•  ํ•˜๋Š” ๊ณผ์ •์„ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด ๊ณผ์ •์€ e-s < 1, ์ฆ‰ ์›์†Œ์˜ ๊ฐœ์ˆ˜๊ฐ€ 1๊ฐœ๊ฐ€ ๋ ๋•Œ๊นŒ์ง€ ์žฌ๊ท€์ ์œผ๋กœ merge_sort๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ํ˜ธ์ถœ์ด ์™„๋ฃŒ๋œ ๊ฐ ๋ถ€๋ถ„ ๊ทธ๋ฃน๋“ค์€ ์ž„์‹œ ๋ฐฐ์—ด tmp์— ๊ทธ ๊ฐ’๋“ค์„ ๋ณต์‚ฌํ•ด ๋†“๋Š”๋‹ค.

์ด์ œ ์ •๋ณต์„ ์œ„ํ•œ ํ•ต์‹ฌ์ ์ธ ๋ถ€๋ถ„์ด๋‹ค. ์ด ๊ตฌ์กฐ ์ž์ฒด๋Š” ๊ธฐ์–ตํ•ด ๋†“๋Š” ๊ฒƒ์ด ์ข‹์„ ๋“ฏ ํ•˜๋‹ค.
์ค‘๊ฐ„ ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ๋‚˜๋ˆˆ ๊ฐ ๋ถ€๋ถ„ ๊ทธ๋ฃน๋“ค์˜ ์ฒซ ๋ฒˆ์งธ ์ธ๋ฑ์Šค๋กœ ๋ถ€ํ„ฐ ๊ฐ์ž ๋น„๊ต๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค.
๋น„๊ต ๊ฒฐ๊ณผ ์ž‘์€ ๊ฐ’๋ถ€ํ„ฐ ์ •๋ ฌ์ด ๋˜๋„๋ก, ์ž‘์€ ๊ฐ’์„ ์›๋ณธ ๋ฐฐ์—ด A[k]์— ์œ„์น˜์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

๋‘ ๋ถ€๋ถ„ ๊ทธ๋ฃน ์ค‘, ํ•˜๋‚˜๊ฐ€ ๋จผ์ € ๋๋‚˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์„ ๋Œ€์ฒ˜ํ•˜๊ธฐ ์œ„ํ•ด while๋ฌธ์„ ํ†ตํ•ด์„œ ๊ฐ ๋ถ€๋ถ„ ๊ทธ๋ฃน์˜ ๋‚จ์€ ์š”์†Œ๋“ค์„ ์›๋ณธ ๋ฐฐ์—ด A์— ๊ทธ๋Œ€๋กœ ์ง‘์–ด๋„ฃ๋Š” ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.

 

 

 

 

๊ธฐ์ˆ˜ ์ •๋ ฌ

 

๊ธฐ์ˆ˜ ์ •๋ ฌ์€ ๊ฐ’ ์ž์ฒด๋ฅผ ๋น„๊ตํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

๊ฐ’์„ ๋†“๊ณ , ๋น„๊ตํ•  ์ž๋ฆฟ์ˆ˜๋ฅผ ์ •ํ•œ ํ›„ ํ•ด๋‹น ์ž๋ฆฟ์ˆ˜๋งŒ ๋น„๊ตํ•œ๋‹ค.

๊ธฐ์ˆ˜ ์ •๋ ฌ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(kn)์œผ๋กœ k๋Š” ๋ฐ์ดํ„ฐ์˜ ์ž๋ฆฟ์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

 

 

์ž๋ฆฟ์ˆ˜ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ?

 

์ง์ ‘ ๊ธฐ์ˆ˜ ์ •๋ ฌ์„ ํ•ด๋ณธ ๋ฐ”๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜์ž๋ฉด, "๋ˆ„์ ํ•˜์—ฌ ์ •๋ ฌ" ์ด๋ผ๊ณ  ๋งํ•  ๊ฒƒ ๊ฐ™๋‹ค.

์ž๋ฆฟ์ˆ˜๋ฅผ ์ผ์˜ ์ž๋ฆฌ๋ถ€ํ„ฐ ์ตœ๋Œ€ ์ž๋ฆฟ ์ˆ˜๊นŒ์ง€ ์ •๋ ฌ์„ ๊พธ์ค€ํžˆ ๊ฑฐ์น˜๋ฉฐ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ๋ฐฉ์‹์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

๊ธฐ์ˆ˜ ์ •๋ ฌ์€ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๊ฐ€์žฅ ์งง๋‹ค. ๊ทธ๋ž˜์„œ ๋งŒ์ผ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ์—์„œ ์ •๋ ฌ ๋ฐ์ดํ„ฐ ๊ฐœ์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ๋งŽ๋‹ค๋ฉด ๊ธฐ์ˆ˜ ์ •๋ ฌ ๋ฐฉ๋ฒ•์„ ๊ณ ๋ คํ•ด ๋ณผ ๊ฒƒ ๊ฐ™๋‹ค.

 

 

๊ธฐ์ˆ˜ ์ •๋ ฌ ๋ฌธ์ œ ํ’€์ด

 

๋ฌธ์ œ์—์„œ N์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์ด ์ปค์ง„๋‹ค๋ฉด, ๊ธฐ์ˆ˜ ์ •๋ ฌ ๋ฌธ์ œ๋ฅผ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฐฑ์ค€ 10989 ๋ฌธ์ œ๋ฅผ ํ’€๋ฉฐ ๊ธฐ์ˆ˜ ์ •๋ ฌ ์ˆ˜ํ–‰ ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด์ž.

 

 

10989๋ฒˆ: ์ˆ˜ ์ •๋ ฌํ•˜๊ธฐ 3

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

www.acmicpc.net

 

import java.util.*;
import java.io.*;
public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int N = Integer.parseInt(br.readLine());
        int[] A = new int[N];
        for(int i=0; i<N; i++) {
            A[i] = Integer.parseInt(br.readLine());
        }
        br.close();
        Radix_Sort(A, 5);
        for(int i=0; i<N; i++) {
            bw.write(A[i] + "\n");
        }
        bw.flush();
        bw.close();

    }
    public static void Radix_Sort(int[] A, int max_size) {
        int[] output = new int[A.length];
        int jarisu = 1;
        int count = 0;
        while(count != max_size) {
            int[] bucket = new int[10];

            for(int i=0; i< A.length; i++) {
                bucket[(A[i] / jarisu) % 10]++;
            }
            for(int i=1; i<10; i++) {
                bucket[i] += bucket[i-1];
            }

            for(int i=A.length-1; i>=0; i--) {
                output[bucket[(A[i] / jarisu % 10)] -1] = A[i];
                bucket[(A[i] / jarisu) % 10]--;
            }
            for(int i=0; i< A.length; i++) {
                A[i] = output[i];
            }
            jarisu = jarisu * 10;
            count++;
        }
    }

}

 

 

 

๊ธฐ์ˆ˜ ์ •๋ ฌ ๋ฉ”์„œ๋“œ๋Š” Radix_Sort()์ด๋‹ค. ํ•ด๋‹น ๋ฉ”์„œ๋“œ์˜ ์ธ์ž๋กœ, ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•  ๋ฐฐ์—ด๊ณผ ์ตœ๋Œ€ ์ž๋ฆฟ์ˆ˜ ๊ฐ’์„ ๋„ฃ์–ด์ค€๋‹ค.

๋ฉ”์„œ๋“œ ๋‚ด๋ถ€๋กœ ๋“ค์–ด๊ฐ€๋ณด๋ฉด, ouput[], bucket[], jarisu ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋‹ค.
์ด ๋ณ€์ˆ˜๋“ค์€ ๊ต‰์žฅํžˆ ์ค‘์š”ํ•˜๋ฏ€๋กœ, ์ž˜ ๊ธฐ์–ตํ•ด ๋‘์ž.

bucket์€ ํ˜„์žฌ ์ž๋ฆฟ์ˆ˜๋“ค์˜ ๋ถ„ํฌ๋ฅผ ํ•ฉ ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ์•Œ๋ ค์ฃผ๋Š” ๋ฐฐ์—ด์ด๋‹ค.(์™œ ํ•ฉ ๋ฐฐ์—ด์ธ๊ฐ€? -> ์ค‘๋ณต ๊ฐ’๋“ค์ด ์—†์–ด์ง€์ง€ ์•Š๋„๋ก ํ•˜๊ธฐ ์œ„ํ•จ). ์ด bucket์„ ํ•ฉ ๋ฐฐ์—ด ๋Œ€์‹  ์šฐ์„  ์ˆœ์œ„ ํ๋กœ๋„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์ด ๊ฐ„๋‹จํ•˜๊ธฐ๋Š” ํ•˜๋‚˜, ํ•ฉ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋”์šฑ ํšจ์œจ์ ์ด๋ผ๊ณ  ํ•œ๋‹ค.


output์€ ์ž„์‹œ ์ •๋ ฌ์„ ์œ„ํ•œ ๋ฐฐ์—ด์ด๋‹ค. ๊ฐ ์ž๋ฆฟ์ˆ˜ ์ด๋™ ์‹œ๋งˆ๋‹ค ์›๋ณธ ๋ฐฐ์—ด๊ณผ ํ•ฉ์ณ์ง„๋‹ค.

jarisu๋Š” ํ˜„์žฌ ์ž๋ฆฟ์ˆ˜๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ์ˆ˜์ด๋‹ค.

 

bucket์€ ๊ฐ ์ž๋ฆฟ์ˆ˜์˜ ๋ถ„ํฌ์˜ ๋นˆ๋„๋ฅผ ๋จผ์ € ์ €์žฅํ•ด์ฃผ๊ณ , ํ•ฉ ๋ฐฐ์—ด ํ˜•์‹์œผ๋กœ ๋ฐ”๊พธ์–ด, ํ›„์— ์ •๋ ฌ ์‹œ ๋ˆ„๋ฝ๋˜๋Š” ๊ฐ’์ด ์—†๋„๋ก ํ•œ๋‹ค.

 

output์€ ํ˜„์žฌ ์ž๋ฆฟ์ˆ˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ์„ ํ•ด์ค€๋‹ค. ํ•ฉ ๋ฐฐ์—ด์˜ ๊ฐ’ ์ž์ฒด๊ฐ€ ์ธ๋ฑ์Šค๊ฐ€ ๋˜์–ด ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋Œ€์‹  ํ•ฉ ๋ฐฐ์—ด์˜ ๊ฐ’์„ ํ•˜๋‚˜์”ฉ ์ค„์—ฌ์ฃผ์–ด์•ผ, ๋ˆ„๋ฝ ๊ฐ’์ด ์—†๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋‹ค์Œ ์ž๋ฆฟ์ˆ˜๋กœ ์ด๋™ํ•˜๊ธฐ ์ „์— ํ˜„์žฌ ์ž๋ฆฟ์ˆ˜ ๊ธฐ์ค€์œผ๋กœ ํ•œ ์ •๋ ฌ ๋ฐ์ดํ„ฐ output์„ ์›๋ณธ ๋ฐฐ์—ด์— ๊ทธ๋Œ€๋กœ ์˜ฎ๊ฒจ์ค€๋‹ค.

 

 

 

Reference

- Do it! ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ - ๊ธฐ์ดˆ ํŽธ