[๐Ÿ“š์ด์ฝ”ํ…Œ #3] ์ •๋ ฌ ๐Ÿ”ฅ

์ตœํ˜ธ๋นˆยท2023๋…„ 4์›” 27์ผ
0
post-thumbnail

์ถœ์ฒ˜ : https://www.youtube.com/watch?v=KGyK-pNvWos&list=PLRx0vPvlEmdAghTr5mXQxGpHjWqSz0dgC&index=4


๐Ÿ“Œ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • ์ •๋ ฌ(Sorting)์ด๋ž€ ๋ฐ์ดํ„ฐ๋ฅผ ํŠน์ •ํ•œ ๊ธฐ์ค€์— ๋”ฐ๋ผ ์ˆœ์„œ๋Œ€๋กœ ๋‚˜์—ดํ•˜๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฌธ์ œ ์ƒํ™ฉ์— ๋”ฐ๋ผ์„œ ์ ์ ˆํ•œ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๊ณต์‹์ฒ˜๋Ÿผ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

โœ๏ธ ์„ ํƒ ์ •๋ ฌ

  • ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ ์ค‘์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ์„ ํƒํ•ด ๋งจ ์•ž์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ์™€ ๋ฐ”๊พธ๋Š” ๊ฒƒ์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

python

array = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8]

for i in range(len(array)):
    min_index = i # ๊ฐ€์žฅ ์ž‘์€ ์›์†Œ์˜ ์ธ๋ฑ์Šค
    for j in range(i + 1, len(array)):
        if array[min_index] > array[j]:
            min_index = j
    array[i], array[min_index] = array[min_index], array[i] # ์Šค์™€ํ”„

print(array)

Java

import java.util.*;

public class Main {

    public static void main(String[] args) {

        int n = 10;
        int[] arr = {7, 5, 9, 0, 3, 1, 6, 2, 4, 8};

        for (int i = 0; i < n; i++) {
            int min_index = i; // ๊ฐ€์žฅ ์ž‘์€ ์›์†Œ์˜ ์ธ๋ฑ์Šค 
            for (int j = i + 1; j < n; j++) {
                if (arr[min_index] > arr[j]) {
                    min_index = j;
                }
            }
            // ์Šค์™€ํ”„
            int temp = arr[i];
            arr[i] = arr[min_index];
            arr[min_index] = temp;
        }
        for(int i = 0; i < n; i++) {
            System.out.print(arr[i] + " ");
        }
    }
}

๐Ÿคฏ ์‹œ๊ฐ„ ๋ณต์žก๋„ ๋ถ„์„
โœ… ์„ ํƒ ์ •๋ ฌ์€ N๋ฒˆ ๋งŒํผ ๊ฐ€์žฅ ์ž‘์€ ์ˆ˜๋ฅผ ์ฐพ์•„์„œ ๋งจ ์•ž์œผ๋กœ ๋ณด๋‚ด์•ผ ํ•œ๋‹ค. ๊ตฌํ˜„ ๋ฐฉ์‹์— ๋”ฐ๋ผ์„œ ์‚ฌ์†Œํ•œ ์˜ค์ฐจ๋Š” ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ „์ฒด ์—ฐ์‚ฐ ํšŸ์ˆ˜๋Š” ์•„๋ž˜๊ณผ ๊ฐ™๋‹ค.

N + (N - 1) + (N - 2) + ... + 2

์ด๋Š” (N^2 + N - 2) / 2 ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋น…์˜ค ํ‘œ๊ธฐ๋ฒ•์— ๋”ฐ๋ผ์„œ O(N^2)์ด๋ผ๊ณ  ์ž‘์„ฑํ•œ๋‹ค.


โœ๏ธ ์‚ฝ์ž… ์ •๋ ฌ

  • ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์”ฉ ๊ณจ๋ผ ์ ์ ˆํ•œ ์œ„์น˜์— ์‚ฝ์ž…. ์„ ํƒ ์ •๋ ฌ์— ๋น„ํ•ด ๊ตฌํ˜„ ๋‚œ์ด๋„๊ฐ€ ๋†’์€ ํŽธ์ด์ง€๋งŒ, ์ผ๋ฐ˜์ ์œผ๋กœ ๋” ํšจ์œจ์ ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

python

array = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8]
# ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค๊ณ  ๊ฐ€์ •
for i in range(1, len(array)):  # 2๋ฒˆ์งธ ์›์†Œ๋ถ€ํ„ฐ ์‹œ์ž‘
    for j in range(i, 0, -1): # ์ธ๋ฑ์Šค i๋ถ€ํ„ฐ 1๊นŒ์ง€ 1์”ฉ ๊ฐ์†Œํ•˜๋ฉฐ ๋ฐ˜๋ณตํ•˜๋Š” ๋ฌธ๋ฒ•
        if array[j] < array[j - 1]: # ํ•œ ์นธ์”ฉ ์™ผ์ชฝ์œผ๋กœ ์ด๋™
            array[j], array[j - 1] = array[j - 1], array[j]
        else: # ์ž๊ธฐ๋ณด๋‹ค ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋‚˜๋ฉด ๊ทธ ์œ„์น˜์—์„œ ๋ฉˆ์ถค (์ค‘์š”)
            break

print(array)

Java

import java.util.*;

public class Main {

    public static void main(String[] args) {

        int n = 10;
        int[] arr = {7, 5, 9, 0, 3, 1, 6, 2, 4, 8};

        for (int i = 1; i < n; i++) {
            // ์ธ๋ฑ์Šค i๋ถ€ํ„ฐ 1๊นŒ์ง€ ๊ฐ์†Œํ•˜๋ฉฐ ๋ฐ˜๋ณตํ•˜๋Š” ๋ฌธ๋ฒ•
            for (int j = i; j > 0; j--) {
                // ํ•œ ์นธ์”ฉ ์™ผ์ชฝ์œผ๋กœ ์ด๋™
                if (arr[j] < arr[j - 1]) {
                    // ์Šค์™€ํ”„(Swap)
                    int temp = arr[j];
                    arr[j] = arr[j - 1];
                    arr[j - 1] = temp;
                }
                // ์ž๊ธฐ๋ณด๋‹ค ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋‚˜๋ฉด ๊ทธ ์œ„์น˜์—์„œ ๋ฉˆ์ถค
                else break;
            }
        }
        for(int i = 0; i < n; i++) {
            System.out.print(arr[i] + " ");
        }
    }
}

๐Ÿคฏ ์‹œ๊ฐ„ ๋ณต์žก๋„ ๋ถ„์„
โœ… ์‚ฝ์ž… ์ •๋ ฌ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N^2)์ด๋ฉฐ, ์„ ํƒ ์ •๋ ฌ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฐ˜๋ณต๋ฌธ์ด ๋‘ ๋ฒˆ ์ค‘์ฒฉ๋˜์–ด ์‚ฌ์šฉ๋œ๋‹ค.
โœ… ์‚ฝ์ž… ์ •๋ ฌ์€ ํ˜„์žฌ ๋ฆฌ์ŠคํŠธ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฑฐ์˜ ์ •๋ ฌ๋˜์–ด ์žˆ๋Š” ์ƒํƒœ๋ผ๋ฉด ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
โœ… ์ตœ์„ ์˜ ๊ฒฝ์šฐ O(N)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

์ด๋ฏธ ์ •๋ ฌ๋˜์–ด ์žˆ๋Š” ์ƒํƒœ์—์„œ ๋‹ค์‹œ ์‚ฝ์ž… ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•˜๋ฉด โ“



โœ๏ธ ํ€ต ์ •๋ ฌ

  • ๊ธฐ์ค€ ๋ฐ์ดํ„ฐ๋ฅผ ์„ค์ •ํ•˜๊ณ  ๊ทธ ๊ธฐ์ค€๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ์™€ ์ž‘์€ ๋ฐ์ดํ„ฐ์˜ ์œ„์น˜๋ฅผ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
  • ์ผ๋ฐ˜์ ์ธ ์ƒํ™ฉ์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘ ํ•˜๋‚˜
  • ๋ณ‘ํ•ฉ ์ •๋ ฌ๊ณผ ๋”๋ถˆ์–ด ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ์ •๋ ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ทผ๊ฐ„์ด ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ํ€ต ์ •๋ ฌ์€ ์ฒซ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ์ค€ ๋ฐ์ดํ„ฐ(Pivot)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿค” ํ€ต ์ •๋ ฌ์ด ๋น ๋ฅธ ์ด์œ 
์ด์ƒ์ ์ธ ๊ฒฝ์šฐ ๋ถ„ํ• ์ด ์ ˆ๋ฐ˜์”ฉ ์ผ์–ด๋‚œ๋‹ค๋ฉด ์ „์ฒด ์—ฐ์‚ฐ ํšŸ์ˆ˜๋กœ O(NlogN)๋ฅผ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ๋‹ค.


python(์ผ๋ฐ˜)

array = [5, 7, 9, 0, 3, 1, 6, 2, 4, 8]

def quick_sort(array, start, end):
    if start >= end: # ์›์†Œ๊ฐ€ 1๊ฐœ์ธ ๊ฒฝ์šฐ ์ข…๋ฃŒ
        return
    pivot = start # ํ”ผ๋ฒ—์€ ์ฒซ ๋ฒˆ์งธ ์›์†Œ
    left = start + 1
    right = end
    while(left <= right):
        # ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต 
        while(left <= end and array[left] <= array[pivot]):
            left += 1
        # ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
        while(right > start and array[right] >= array[pivot]):
            right -= 1
        if(left > right): # ์—‡๊ฐˆ๋ ธ๋‹ค๋ฉด ์ž‘์€ ๋ฐ์ดํ„ฐ์™€ ํ”ผ๋ฒ—์„ ๊ต์ฒด
            array[right], array[pivot] = array[pivot], array[right]
        else: # ์—‡๊ฐˆ๋ฆฌ์ง€ ์•Š์•˜๋‹ค๋ฉด ์ž‘์€ ๋ฐ์ดํ„ฐ์™€ ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ต์ฒด
            array[left], array[right] = array[right], array[left]
    # ๋ถ„ํ•  ์ดํ›„ ์™ผ์ชฝ ๋ถ€๋ถ„๊ณผ ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„์—์„œ ๊ฐ๊ฐ ์ •๋ ฌ ์ˆ˜ํ–‰
    quick_sort(array, start, right - 1)
    quick_sort(array, right + 1, end)

quick_sort(array, 0, len(array) - 1)
print(array)

python(์ˆ์ฝ”๋”ฉ)

array = [5, 7, 9, 0, 3, 1, 6, 2, 4, 8]

def quick_sort(array):
    # ๋ฆฌ์ŠคํŠธ๊ฐ€ ํ•˜๋‚˜ ์ดํ•˜์˜ ์›์†Œ๋งŒ์„ ๋‹ด๊ณ  ์žˆ๋‹ค๋ฉด ์ข…๋ฃŒ
    if len(array) <= 1:
        return array

    pivot = array[0] # ํ”ผ๋ฒ—์€ ์ฒซ ๋ฒˆ์งธ ์›์†Œ
    tail = array[1:] # ํ”ผ๋ฒ—์„ ์ œ์™ธํ•œ ๋ฆฌ์ŠคํŠธ

    left_side = [x for x in tail if x <= pivot] # ๋ถ„ํ• ๋œ ์™ผ์ชฝ ๋ถ€๋ถ„
    right_side = [x for x in tail if x > pivot] # ๋ถ„ํ• ๋œ ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„

    # ๋ถ„ํ•  ์ดํ›„ ์™ผ์ชฝ ๋ถ€๋ถ„๊ณผ ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„์—์„œ ๊ฐ๊ฐ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ์ „์ฒด ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜
    return quick_sort(left_side) + [pivot] + quick_sort(right_side)

print(quick_sort(array))

Java

import java.util.*;

public class Main {

    public static void quickSort(int[] arr, int start, int end) {
        if (start >= end) return; // ์›์†Œ๊ฐ€ 1๊ฐœ์ธ ๊ฒฝ์šฐ ์ข…๋ฃŒ
        int pivot = start; // ํ”ผ๋ฒ—์€ ์ฒซ ๋ฒˆ์งธ ์›์†Œ
        int left = start + 1;
        int right = end;
        while (left <= right) {
            // ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
            while (left <= end && arr[left] <= arr[pivot]) left++;
            // ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
            while (right > start && arr[right] >= arr[pivot]) right--;
            // ์—‡๊ฐˆ๋ ธ๋‹ค๋ฉด ์ž‘์€ ๋ฐ์ดํ„ฐ์™€ ํ”ผ๋ฒ—์„ ๊ต์ฒด
            if (left > right) {
                int temp = arr[pivot];
                arr[pivot] = arr[right];
                arr[right] = temp;
            }
            // ์—‡๊ฐˆ๋ฆฌ์ง€ ์•Š์•˜๋‹ค๋ฉด ์ž‘์€ ๋ฐ์ดํ„ฐ์™€ ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ต์ฒด
            else {
                int temp = arr[left];
                arr[left] = arr[right];
                arr[right] = temp;
            }
        }
        // ๋ถ„ํ•  ์ดํ›„ ์™ผ์ชฝ ๋ถ€๋ถ„๊ณผ ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„์—์„œ ๊ฐ๊ฐ ์ •๋ ฌ ์ˆ˜ํ–‰
        quickSort(arr, start, right - 1);
        quickSort(arr, right + 1, end);
    }

    public static void main(String[] args) {
        int n = 10;
        int[] arr = {7, 5, 9, 0, 3, 1, 6, 2, 4, 8};

        quickSort(arr, 0, n - 1);

        for(int i = 0; i < n; i++) {
            System.out.print(arr[i] + " ");
        }
    }
}

๐Ÿคฏ ์‹œ๊ฐ„ ๋ณต์žก๋„ ๋ถ„์„
โœ… ํ€ต ์ •๋ ฌ์€ ํ‰๊ท ์˜ ๊ฒฝ์šฐ O(NlogN)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ์›์†Œ๋ฅผ ํ”ผ๋ฒ—์œผ๋กœ ์‚ผ์„ ๋•Œ, ์ด๋ฏธ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์— ๋Œ€ํ•ด์„œ ํ€ต ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•˜๋ฉด โ“
๐Ÿ‘‰๐Ÿป ์ตœ์•…์˜ ๊ฒฝ์šฐ(ํ”ผ๋ฒ—์„ ์ž˜๋ชป ์„ค์ •ํ•˜์˜€์„ ๋•Œ)์ด๊ธฐ ๋•Œ๋ฌธ์— O(N^2)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค.



โœ๏ธ ๊ณ„์ˆ˜ ์ •๋ ฌ : Counting Sort

  • ํŠน์ •ํ•œ ์กฐ๊ฑด์ด ๋ถ€ํ•ฉํ•  ๋•Œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋Š” ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค.
  • ๊ณ„์ˆ˜ ์ •๋ ฌ์€ ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ ๋ฒ”์œ„๊ฐ€ ์ œํ•œ๋˜์–ด ์ •์ˆ˜ ํ˜•ํƒœ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์„ ๋•Œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒ๋Œ€์ ์œผ๋กœ ๊ณต๊ฐ„๋ณต์žก๋„๊ฐ€ ๋†’๋‹ค.
  • ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๊ฐ€ N, ๋ฐ์ดํ„ฐ(์–‘์ˆ˜) ์ค‘ ์ตœ๋Œ“๊ฐ’์ด K์ผ ๋•Œ ์ตœ์•…์˜ ๊ฒฝ์šฐ์—๋„ ์ˆ˜ํ–‰ ์‹œ๊ฐ„ O(N + K)๋ฅผ ๋ณด์žฅ

python

# ๋ชจ๋“  ์›์†Œ์˜ ๊ฐ’์ด 0๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๋‹ค๊ณ  ๊ฐ€์ •
array = [7, 5, 9, 0, 3, 1, 6, 2, 9, 1, 4, 8, 0, 5, 2]
# ๋ชจ๋“  ๋ฒ”์œ„๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฆฌ์ŠคํŠธ ์„ ์–ธ (๋ชจ๋“  ๊ฐ’์€ 0์œผ๋กœ ์ดˆ๊ธฐํ™”)
count = [0] * (max(array) + 1)

for i in range(len(array)):
    count[array[i]] += 1 # ๊ฐ ๋ฐ์ดํ„ฐ์— ํ•ด๋‹นํ•˜๋Š” ์ธ๋ฑ์Šค์˜ ๊ฐ’ ์ฆ๊ฐ€

for i in range(len(count)): # ๋ฆฌ์ŠคํŠธ์— ๊ธฐ๋ก๋œ ์ •๋ ฌ ์ •๋ณด ํ™•์ธ
    print(str(i)*count[i], end = '') # ์ด๊ฒŒ ๋” ํšจ์œจ์ 

Java

import java.util.*;

public class Main {

    public static final int MAX_VALUE = 9;

    public static void main(String[] args) {
  	
        int n = 15;
        // ๋ชจ๋“  ์›์†Œ์˜ ๊ฐ’์ด 0๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๋‹ค๊ณ  ๊ฐ€์ •
        int[] arr = {7, 5, 9, 0, 3, 1, 6, 2, 9, 1, 4, 8, 0, 5, 2};
        // ๋ชจ๋“  ๋ฒ”์œ„๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฐฐ์—ด ์„ ์–ธ(๋ชจ๋“  ๊ฐ’์€ 0์œผ๋กœ ์ดˆ๊ธฐํ™”)
        int[] cnt = new int[MAX_VALUE + 1];

        for (int i = 0; i < n; i++) {
            cnt[arr[i]] += 1; // ๊ฐ ๋ฐ์ดํ„ฐ์— ํ•ด๋‹นํ•˜๋Š” ์ธ๋ฑ์Šค์˜ ๊ฐ’ ์ฆ๊ฐ€
        }
        for (int i = 0; i <= MAX_VALUE; i++) { // ๋ฐฐ์—ด์— ๊ธฐ๋ก๋œ ์ •๋ ฌ ์ •๋ณด ํ™•์ธ
            for (int j = 0; j < cnt[i]; j++) {
                System.out.print(i + " "); // ๋„์–ด์“ฐ๊ธฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋“ฑ์žฅํ•œ ํšŸ์ˆ˜๋งŒํผ ์ธ๋ฑ์Šค ์ถœ๋ ฅ
            }
        }
    }
}

๐Ÿคฏ ๋ณต์žก๋„ ๋ถ„์„
โœ… ๊ณ„์ˆ˜ ์ •๋ ฌ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„์™€ ๊ณต๊ฐ„ ๋ณต์žก๋„๋Š” ๋ชจ๋‘ O(N + K)
โœ… ๊ณ„์ˆ˜ ์ •๋ ฌ์€ ๋•Œ์— ๋”ฐ๋ผ์„œ ์‹ฌ๊ฐํ•œ ๋น„ํšจ์œจ์„ฑ์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๐Ÿ‘‰๐Ÿป ๋ฐ์ดํ„ฐ๊ฐ€ 0๊ณผ 999,999๋กœ ๋‹จ 2๊ฐœ๋งŒ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ์‹ฌ๊ฐํ•œ ๊ณต๊ฐ„ ๋‚ญ๋น„

โœ… ๊ณ„์ˆ˜ ์ •๋ ฌ์€ ๋™์ผํ•œ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ๋“ฑ์žฅํ•  ๋•Œ ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
๐Ÿ‘‰๐Ÿป ์„ฑ์ ์˜ ๊ฒฝ์šฐ 100์ ์„ ๋งž์€ ํ•™์ƒ์ด ์—ฌ๋Ÿฌ ๋ช…์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ณ„์ˆ˜ ์ •๋ ฌ์ด ํšจ๊ณผ์ 




โœ”๏ธ [์‹ค์Šต] ๋‘ ๋ฐฐ์—ด์˜ ์›์†Œ ๊ต์ฒด ๐Ÿ”„

๋งค๋ฒˆ ๋ฐฐ์—ด A์—์„œ ๊ฐ€์žฅ ์ž‘์€ ์›์†Œ๋ฅผ ๊ณจ๋ผ์„œ, ๋ฐฐ์—ด B์—์„œ ๊ฐ€์žฅ ํฐ ์›์†Œ์™€ ๊ต์ฒดํ•œ๋‹ค.

โ˜๐Ÿป ๊ฐ€์žฅ ๋จผ์ € ๋ฐฐ์—ด A์™€ B๊ฐ€ ์ฃผ์–ด์ง€๋ฉด A์— ๋Œ€ํ•˜์—ฌ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•˜๊ณ , B์— ๋Œ€ํ•˜์—ฌ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ
โœŒ๐Ÿป ์ดํ›„์— ๋‘ ๋ฐฐ์—ด์˜ ์›์†Œ๋ฅผ ์ฒซ ๋ฒˆ์งธ ์ธ๋ฑ์Šค๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ ํ™•์ธํ•˜๋ฉด์„œ A์˜ ์›์†Œ๊ฐ€ B์˜ ์›์†Œ๋ณด๋‹ค ์ž‘์„ ๋•Œ์—๋งŒ ๊ต์ฒด๋ฅผ ์ˆ˜ํ–‰

์ด ๋ฌธ์ œ์—์„œ๋Š” ๋‘ ๋ฐฐ์—ด์˜ ์›์†Œ๊ฐ€ ์ตœ๋Œ€ 100,000๊ฐœ๊นŒ์ง€ ์ž…๋ ฅ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์ตœ์•…์˜ ๊ฒฝ์šฐ O(NlogN)์„ ๋ณด์žฅํ•˜๋Š” ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•ด์•ผ ํ•œ๋‹ค.**


python

n, k = map(int, input().split()) # N๊ณผ K๋ฅผ ์ž…๋ ฅ ๋ฐ›๊ธฐ
a = list(map(int, input().split())) # ๋ฐฐ์—ด A์˜ ๋ชจ๋“  ์›์†Œ๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
b = list(map(int, input().split())) # ๋ฐฐ์—ด B์˜ ๋ชจ๋“  ์›์†Œ๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ

a.sort() # ๋ฐฐ์—ด A๋Š” ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ ์ˆ˜ํ–‰
b.sort(reverse=True) # ๋ฐฐ์—ด B๋Š” ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ ์ˆ˜ํ–‰

# ์ฒซ ๋ฒˆ์งธ ์ธ๋ฑ์Šค๋ถ€ํ„ฐ ํ™•์ธํ•˜๋ฉฐ, ๋‘ ๋ฐฐ์—ด์˜ ์›์†Œ๋ฅผ ์ตœ๋Œ€ K๋ฒˆ ๋น„๊ต
for i in range(k):
    # A์˜ ์›์†Œ๊ฐ€ B์˜ ์›์†Œ๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ
    if a[i] < b[i]:
        # ๋‘ ์›์†Œ๋ฅผ ๊ต์ฒด
        a[i], b[i] = b[i], a[i]
    else: # A์˜ ์›์†Œ๊ฐ€ B์˜ ์›์†Œ๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์„ ๋•Œ, ๋ฐ˜๋ณต๋ฌธ์„ ํƒˆ์ถœ
        break

print(sum(a)) # ๋ฐฐ์—ด A์˜ ๋ชจ๋“  ์›์†Œ์˜ ํ•ฉ์„ ์ถœ๋ ฅ

Java

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        // N๊ณผ K๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
        int n = sc.nextInt();
        int k = sc.nextInt();

        // ๋ฐฐ์—ด A์˜ ๋ชจ๋“  ์›์†Œ๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
        Integer[] a = new Integer[n];
        for (int i = 0; i < n; i++) {
            a[i] = sc.nextInt();
        }
        // ๋ฐฐ์—ด B์˜ ๋ชจ๋“  ์›์†Œ๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
        Integer[] b = new Integer[n];
        for (int i = 0; i < n; i++) {
            b[i] = sc.nextInt();
        }

        // ๋ฐฐ์—ด A๋Š” ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ ์ˆ˜ํ–‰
        Arrays.sort(a);
        // ๋ฐฐ์—ด B๋Š” ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ ์ˆ˜ํ–‰
        Arrays.sort(b, Collections.reverseOrder());

        // ์ฒซ ๋ฒˆ์งธ ์ธ๋ฑ์Šค๋ถ€ํ„ฐ ํ™•์ธํ•˜๋ฉฐ, ๋‘ ๋ฐฐ์—ด์˜ ์›์†Œ๋ฅผ ์ตœ๋Œ€ K๋ฒˆ ๋น„๊ต 
        for (int i = 0; i < k; i++) {
            // A์˜ ์›์†Œ๊ฐ€ B์˜ ์›์†Œ๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ
            if (a[i] < b[i]) {
                // ๋‘ ์›์†Œ๋ฅผ ๊ต์ฒด
                int temp = a[i];
                a[i] = b[i];
                b[i] = temp;
            }
            // A์˜ ์›์†Œ๊ฐ€ B์˜ ์›์†Œ๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์„ ๋•Œ, ๋ฐ˜๋ณต๋ฌธ์„ ํƒˆ์ถœ
            else break;
        }

        // ๋ฐฐ์—ด A์˜ ๋ชจ๋“  ์›์†Œ์˜ ํ•ฉ์„ ์ถœ๋ ฅ
        long result = 0;
        for (int i = 0; i < n; i++) {
            result += a[i];
        }
        System.out.println(result);
    }
}
profile
๋ฐฑ์—”๋“œ ๋ณ‘์•„๋ฆฌ ๐Ÿฅ

0๊ฐœ์˜ ๋Œ“๊ธ€