Super Kawaii Cute Cat Kaoani
๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Algorithm/Python

[Python] ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ - ์„ ํƒ, ์‚ฝ์ž…, ํ€ต, ๊ณ„์ˆ˜

728x90


๐Ÿ’ก ์„ ํƒ ์ •๋ ฌ (Selection Sort)

  • ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ ์ค‘์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ์„ ํƒํ•ด ๋งจ ์•ž์— ๋ฐ์ดํ„ฐ์™€ ๋ฐ”๊พผ๋‹ค.
  1. ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋งจ ์•ž ๋ฐ์ดํ„ฐ์™€ ๋ฐ”๊ฟˆ
  2. ์ด๋Ÿฌํ•œ ๊ณผ์ • ๋ฐ˜๋ณต (๋งˆ์ง€๋ง‰ ๊ฒฝ์šฐ์—๋Š” ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค)
  • ํƒ์ƒ‰ ๋ฒ”์œ„๋Š” ์ ์  ์ค„์–ด๋“ ๋‹ค.
  • ๋งค๋ฒˆ ์„ ํ˜• ํƒ์ƒ‰ํ•œ๋‹ค.
  • ๋ณต์žก๋„ O(N^2) : n๋ฒˆ ๋งŒํผ ๊ฐ€์žฅ ์ž‘์€ ์ˆ˜๋ฅผ ์ฐพ์•„์„œ ๋งจ ์•ž์œผ๋กœ ๋ณด๋‚ธ๋‹ค.
  • n + (n-1) + (n-2) = (n^2 +n - 2) / 2

๐Ÿงท ๊ตฌํ˜„ ๊ณผ์ •

array = [๋ฆฌ์ŠคํŠธ]

for : ๋ฆฌ์ŠคํŠธ ๊ธธ์ด๋งŒํผ

    for : i๋ถ€ํ„ฐ 0๊นŒ์ง€ 1์”ฉ ์ค„๋ฉด์„œ

    if : ํ˜„์žฌ ์›์†Œ๊ฐ€ ์•ž์˜ ์›์†Œ๋ณด๋‹ค ์ž‘๋‹ค๋ฉด : ์„œ๋กœ ๋ฐ”๊ฟˆ

    else : break

print(๋ฆฌ์ŠคํŠธ)

๐Ÿงท ํŒŒ์ด์ฌ ์ฝ”๋“œ

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

for i in range(1, len(array)):
    for j in range(i, 0, -1):
        if array[j] < array[j-1]:
            array[j], array[j-1] = array[j-1], array[j]
        else:
            break

print(array)

 

๐Ÿ’ก ์‚ฝ์ž… ์ •๋ ฌ

  • ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์”ฉ ๊ณจ๋ผ ์ ์ ˆํ•œ ์œ„์น˜์— ์‚ฝ์ž…ํ•œ๋‹ค.
  • ์„ ํƒ ์ •๋ ฌ์— ๋น„ํ•ด ๋‚œ์ด๋„ ์กฐ๊ธˆ ๋†’์ง€๋งŒ ๋น ๋ฅด๋‹ค.
7 5 9 0 3 1 6 2 4 8
  1. ์•ž์˜ ์›์†Œ๊ฐ€ ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •
  2. 7์€ ๊ทธ์ž์ฒด๋กœ ์ •๋ ฌ, 5๊ฐ€ ์–ด๋–ค ์œ„์น˜๋กœ ๋“ค์–ด๊ฐˆ์ง€ ์™ผ์ชฝ์ด๊ฑฐ๋‚˜ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋“ค์–ด๊ฐ€๊ฑฐ๋‚˜ ์ž‘์œผ๋ฉด ์™ผ์ชฝ์œผ๋กœ (์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ๊ฐ€์ •)
  3. 9๊ฐ€ 3๊ณณ(5์•ž, 5์™€ 7์‚ฌ์ด, 7๋’ค) ์ค‘ ์–ด๋””์— ๋“ค์–ด๊ฐˆ ์ง€, 7๋ณด๋‹ค ํฌ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋Œ€๋กœ
  4. 0์ด ์–ด๋””๋กœ ๋“ค์–ด๊ฐˆ์ง€, 5์˜ ์™ผ์ชฝ๊นŒ์ง€ ํ•˜๋‚˜์”ฉ ์ด๋™, ๋งค๋ฒˆ ์™ผ์ชฝ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ์™€ ์œ„์น˜๋ฅผ ๋ฐ”๊พธ๋ฉด์„œ
  5. ์ด ๊ณผ์ • ๋ฐ˜๋ณต
  • ๋ณต์žก๋„ O(N^2) : ๋ฐ˜๋ณต๋ฌธ ์ค‘์ฒฉ -> ๋น„๊ต, ์Šค์™€ํ•‘
  • ํ˜„์žฌ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ •๋ ฌ๋˜์–ด ์žˆ๋Š” ์ƒํƒœ๋ฉด ๋งค์šฐ ๋น ๋ฆ„ - ๋‹ค ์ •๋ ฌ๋˜๋ฉด O(N)

๐Ÿงท ๊ตฌํ˜„ ๊ณผ์ •

array = ๋ฆฌ์ŠคํŠธ

    for ๋ฆฌ์ŠคํŠธ ๊ธธ์ด๋งŒํผ : ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’

    for i, 0, -1 : 1์”ฉ ๊ฐ์†Œํ•˜๋ฉด์„œ 

        if min_index์˜ ๊ฐ’๋ณด๋‹ค ์ธ๋ฑ์Šค j์˜ ๊ฐ’์ด ์ž‘๋‹ค๋ฉด : min_index๋ฅผ j๋กœ ์—…๋ฐ์ดํŠธ

    i์™€ ๊ฐ€์žฅ ์ž‘์€ ์ธ๋ฑ์Šค ์Šค์™€ํ”„

๐Ÿงท ํŒŒ์ด์ฌ ์ฝ”๋“œ

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)

 

๐Ÿ’ก ํ€ต ์ •๋ ฌ

  • ๊ธฐ์ค€ ๋ฐ์ดํ„ฐ๋ฅผ ์„ค์ •, ๊ทธ ๊ธฐ์ค€๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ์™€ ์ž‘์€ ๋ฐ์ดํ„ฐ ์œ„์น˜๋ฅผ ๋ฐ”๊ฟˆ
  • ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ
  • ๋ณ‘ํ•ฉ๊ณผ ๋”์šธ์–ด ํ‘œ์ค€ ์ •๋ ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ทผ๊ฐ„
  • ๊ฐ€์žฅ ๊ธฐ๋ณธ์  ํ€ต ์ •๋ ฌ์€ ์ฒซ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ์ค€ ๋ฐ์ดํ„ฐ(pivot)์œผ๋กœ ์„ค์ •

๐Ÿงท ๊ตฌํ˜„ ๊ณผ์ •

  1. ํ˜„์žฌ ํ”ผ๋ฒ—์˜ ๊ฐ’์€ 5, ์™ผ์ชฝ์—์„œ๋ถ€ํ„ฐ ํฐ๊ฐ’, ์˜ค๋ฅธ์ชฝ์—์„œ ๋ถ€ํ„ฐ ์ž‘์€๊ฐ’ 4์™€ 7์˜ ์œ„์น˜ ๋ฐ”๊ฟˆ
  2. ์œ„์น˜๊ฐ€ ์—‡๊ฐˆ๋ฆฐ๊ฒฝ์šฐ ์ž‘์€ ๋ฐ์ดํ„ฐ์™€ ํ”ผ๋ฒ—๊ฐ’์˜ ์œ„์น˜๋ฅผ ๋ฐ”๊ฟ”์คŒ
  3. ํ”ผ๋ฒ—์ด ์ค‘๊ฐ„์œผ๋กœ ๋“ค์–ด๊ฐ€๊ฒŒ๋œ๋‹ค.-> ์™ผ์ชฝ์˜ ๋ฐ์ดํ„ฐ๋Š” ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘๊ณ , ์˜ค๋ฅธ์ชฝ์€ ํฐ ๋ฐ์ดํ„ฐ
  4. ์™ผ์ชฝ ์˜ค๋ฅธ์ชฝ์„ ๊ฐ ๊ฐ์˜ ๋ฐฐ์—ด๋กœ ์ทจ๊ธ‰ํ•˜์—ฌ ๊ฐ๊ฐ ํ€ต ์ •๋ ฌ ์ˆ˜ํ–‰ -> ์žฌ๊ท€์ ์œผ๋กœ, ๋ฒ”์œ„ ์ ์  ์ž‘์•„์ง
  • ๋ฐ์ดํ„ฐ๊ฐ€ ์ ˆ๋ฐ˜์— ๊ฐ€๊น๊ฒŒ ๋ถ„ํ• ๋œ๋‹ค๋ฉด O(nlogn) : ๋„ˆ๋น„ x ๋†’์ด
  • ํ‰๊ท ์˜ ๊ฒฝ์šฐ O(NlogN)
  • ์ตœ์•…(N^2)
  • ์ด๋ฏธ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์ธ ๊ฒฝ์šฐ : ๋ถ„ํ• ์ด ์ด๋ฃจ์–ด์กŒ์„ ๋•Œ ๋ถ„ํ• ์ด ์ด๋ฃจ์–ด์ง€์ง€ ์•Š๋Š”๋‹ค. ๋ถ„ํ• ์„ ์œ„ํ•ด ๋งค๋ฒˆ ์„ ํ˜• ํƒ์ƒ‰์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๐Ÿงท ๊ตฌํ˜„ ๊ณผ์ •

array = ๋ฆฌ์ŠคํŠธ

def ํ€ต (array, start, end) # ๋ฆฌ์ŠคํŠธ, ์ฒซ

    if (start >= end) ์›์†Œ ํ•œ๊ฐœ์ผ๋•Œ ์ข…๋ฃŒ : return

    pivot =   ์ฒซ ๋ฒˆ์งธ ์›์†Œ

    left = ์ฒซ๋ฒˆ์งธ + 1 (๊ฐ€์žฅ ์™ผ์ชฝ)

    right = end (๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ)

while left <= right

    while ์™ผ์ชฝ์—์„œ ๋ถ€ํ„ฐ ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ ์ฐพ์„ ๋•Œ๊นŒ์ง€: left 1์”ฉ ์ฆ๊ฐ€

    while ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘์€ ๋ฐ์ดํ„ฐ ์ฐพ์„ ๋•Œ๊นŒ์ง€ : right 1์”ฉ ๊ฐ์†Œ

    if (left > right) ์—‡๊ฐˆ๋ ธ๋‹ค๋ฉด, ์ž‘์€ ๋ฐ์ดํ„ฐ <-> ํ”ผ๋ฒ— --- ๋ถ„ํ• 

    else ์—‡๊ฐˆ๋ฆฌ์ง€ ์•Š์•˜๋‹ค๋ฉด, ์ž‘์€ ๋ฐ์ดํ„ฐ <-> ํฐ ๋ฐ์ดํ„ฐ 

quick_sort(๋ฆฌ์ŠคํŠธ, ์‹œ์ž‘, ์˜ค๋ฅธ์ชฝ-1)

quick_sort(๋ฆฌ์ŠคํŠธ, ์˜ค๋ฅธ์ชฝ+1, ๋)

 

ํ€ต (array, 0, ๋ฆฌ์ŠคํŠธ๊ธธ์ด-1)

๐Ÿงท ํŒŒ์ด์ฌ ์ฝ”๋“œ

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

def quick_sort(array, start, end):
    if start >= end:
        return
    pivot = start
    left = start + 1
    right = end

    while (left <= right):
        while (left <= end) and (array[left] <= array[pivot]): # array[left]<=array[pivot]
            left += 1
        while (right > start) and (array[right] >= array[pivot]):
            right -= 1
        if left > right : 
            array[pivot], array[right] = array[right], array[pivot] #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("quick_sort :", array)

 

๐Ÿงท ํŒŒ์ด์ฌ ์„ฑ์งˆ ์ด์šฉํ•œ ์ฝ”๋“œ

def ํ€ต(๋ฆฌ์ŠคํŠธ):

    if ๊ธธ์ด <= 1: return

    pivot = ์ธ๋ฑ์Šค 0

    tail = [1:] ํ”ผ๋ฒ— ์ œ์™ธ ๋ฆฌ์ŠคํŠธ

    ์™ผ์ชฝ๋ฆฌ์ŠคํŠธ = tail ๋Œ๋ฉด์„œ pivot๋ณด๋‹ค ์ž‘์€ ๊ฑฐ

    ์˜ค๋ฅธ์ชฝ๋ฆฌ์ŠคํŠธ = tail ๋Œ๋ฉด์„œ pivot๋ณด๋‹ค ํฐ ๊ฑฐ

    return ์™ผ์ชฝ๋ฆฌ์ŠคํŠธ+ํ”ผ๋ฒ—+์˜ค๋ฅธ์ชฝ๋ฆฌ์ŠคํŠธ

def quick_sort2(array):
    if len(array) <= 1:
        return array
    pivot = array[0]
    tail = array[1:]

    left_array = [x for x in tail if x <= pivot]
    right_array = [x for x in tail if x > pivot]

    return quick_sort2(left_array) + [pivot] + quick_sort2(right_array)
    
    print("quick_sort2 :", quick_sort2(array))

๐Ÿ’ก๊ณ„์ˆ˜ ์ •๋ ฌ

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

๐Ÿงท ๊ตฌํ˜„ ๊ณผ์ •

array = ๋ฆฌ์ŠคํŠธ

count๋ฆฌ์ŠคํŠธ = [0] * (์ตœ๋Œ“๊ฐ’+1)

for ๋ฆฌ์ŠคํŠธ ๊ธธ์ด ๋งŒํผ : count์˜ ํ•ด๋‹น ์ธ๋ฑ์Šค์— 1 ์ฆ๊ฐ€

for count๊ธธ์ด ๋งŒํผ

    for count ๋ฆฌ์ŠคํŠธ ์ธ๋ฑ์Šค๋ฅผ ๋Œ๋ฉด์„œ : ๊ทธ ์•ˆ์— ๋“ค์–ด์žˆ๋Š” ๊ฐ’๋งŒํผ ํ”„๋ฆฐํŠธ

๐Ÿงท ํŒŒ์ด์ฌ ์ฝ”๋“œ

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

count = [0] * (max(array)+1)

for i in array:
    count[i] += 1

for i in range(len(count)):
    for j in range(count[i]):
        print(i, end=" ")

 

  • ์‹œ๊ฐ„ ๋ณต์žก๋„์™€ ๊ณต๊ฐ„ ๋ณต์žก๋„ ๋ชจ๋‘ N(O+K)
    ๋ฐ์ดํ„ฐ๊ฐ€ 0๊ณผ 999999๋ผ๋ฉด ๋น„ํšจ์œจ์ 
  • ๋™์ผํ•œ ๋ฐ์ดํ„ฐ ๊ฐ’์ด ์—ฌ๋Ÿฌ๊ฐœ ๋“ฑ์žฅํ•  ๋•Œ (์„ฑ์ ์˜ ๊ฒฝ์šฐ 100์ ์ด ์—ฌ๋Ÿฌ๋ช…)
728x90