Bibi's DevLog ๐Ÿค“๐ŸŽ

[Hello Coding ์•Œ๊ณ ๋ฆฌ์ฆ˜] 2์žฅ. ์„ ํƒ ์ •๋ ฌ ๋ณธ๋ฌธ

ํ”„๋กœ๊ทธ๋ž˜๋ฐ/Algorithm ์•Œ๊ณ ๋ฆฌ์ฆ˜

[Hello Coding ์•Œ๊ณ ๋ฆฌ์ฆ˜] 2์žฅ. ์„ ํƒ ์ •๋ ฌ

๋น„๋น„ bibi 2021. 6. 30. 18:43

[210630]

(์–ด์ œ์— ์ด์–ด์„œ ์ž‘์„ฑ)

Hello Coding ์•Œ๊ณ ๋ฆฌ์ฆ˜

2์žฅ. ์„ ํƒ ์ •๋ ฌ

๋ฐฐ์—ด, ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ, ์„ ํƒ ์ •๋ ฌ์— ๊ด€ํ•ด ๊ณต๋ถ€ํ•œ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋™์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ•

์ปดํ“จํ„ฐ ๋ฉ”๋ชจ๋ฆฌ์˜ ๋™์ž‘ ๋ฐฉ์‹.

  • ์—„์ฒญ๋‚˜๊ฒŒ ๋งŽ์€ ์„œ๋ž์ด ์žˆ๊ณ , ๊ฐ ์„œ๋ž์—๋Š” ์ฃผ์†Œ๊ฐ€ ๋ถ™์–ด ์žˆ๋‹ค.
  • ๋ฉ”๋ชจ๋ฆฌ์— ๋ฌด์–ธ๊ฐ€๋ฅผ ์ €์žฅํ•  ๋•Œ๋Š” ์ปดํ“จํ„ฐ์—๊ฒŒ ๊ณต๊ฐ„์„ ์š”์ฒญํ•œ๋‹ค.
  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์›์†Œ๋ฅผ ์ €์žฅํ•  ๋•Œ, '๋ฐฐ์—ด'๊ณผ '๋ฆฌ์ŠคํŠธ' ๋‘ ๋ฐฉ์‹ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•œ๋‹ค.

๋ฐฐ์—ด vs ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ

๋ฐฐ์—ด (array)

  • ์นœ๊ตฌ๋“ค๊ณผ ์˜ํ™”๋ฅผ ๋ณด๋Ÿฌ ๊ฐ€์„œ ์ž๋ฆฌ๋ฅผ ์ฐพ์„ ๋•Œ์— ๋น„์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • 3๋ช…์ด์„œ ์ขŒ์„์„ ์˜ˆ์•ฝํ–ˆ๋Š”๋ฐ ํ•œ ๋ช…์ด ๋” ์™”๋‹ค๋ฉด, 4๋ช…์ด์„œ ๋ถ™์–ด ์•‰์„ ์ˆ˜ ์žˆ๋Š” ์ขŒ์„์œผ๋กœ ๋‹ค ๊ฐ™์ด ์˜ฎ๊ฒจ ์•‰์•„์•ผ ํ•จ
  • ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์›์†Œ๋Š” ๊ฐ™์€ ์ž๋ฃŒํ˜•์ด์–ด์•ผ ํ•œ๋‹ค.
  • ์žฅ์  : READ๊ฐ€ ๋น ๋ฅด๋‹ค.
    • ์ธ๋ฑ์Šค index : ๋ฐฐ์—ด์—์„œ๋Š” ๋ชจ๋“  ์›์†Œ์˜ ์ฃผ์†Œ๋ฅผ ๋‹ค ์•Œ๊ณ  ์žˆ๋‹ค.
      • ์ธ๋ฑ์Šค๋Š” 1์ด ์•„๋‹ˆ๋ผ 0๋ถ€ํ„ฐ ์‹œ์ž‘. (0, 1, 2, 3 ...)
    • ์ฆ‰ ๋ฐฐ์—ด์—์„œ๋Š” ๋ฐฐ์—ด ์•ˆ์˜ ์–ด๋–ค ์›์†Œ๋“  ๋ฐ”๋กœ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. (O(1) , ๊ณ ์ • ์‹œ๊ฐ„)
    • ์ž„์˜์˜ ์›์†Œ ๊ฐ’์„ ์ฐพ๋Š” ๋ฐ ์ตœ์ ์ด๋‹ค.
  • ๋‹จ์  : INSERT, DELETE๊ฐ€ ๋Š๋ฆฌ๋‹ค.
    • INSERT - ๊ณต๊ฐ„์ด ๋ชจ์ž๋ผ๋ฉด, ๋งค๋ฒˆ ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์›์†Œ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ƒˆ๋กœ์šด ์œ„์น˜๋กœ ์˜ฎ๊ฒจ์•ผ ํ•œ๋‹ค. (O(n) , ์„ ํ˜• ์‹œ๊ฐ„)
    • ์ˆœ์„œ๋ฅผ ๋ฐ”๊ฟ€ ๋•Œ๋„ ๋’ค์— ์˜ค๋Š” ๋ชจ๋“  ์›์†Œ์˜ ์œ„์น˜๋ฅผ ๋ฐ”๊พธ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋Š๋ฆฌ๋‹ค.
    • DELETE - ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์‚ญ์ œํ•œ ์›์†Œ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์›์†Œ๋“ค์„ ์˜ฎ๊ฒจ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋Š๋ฆฌ๋‹ค. (O(n), ์„ ํ˜• ์‹œ๊ฐ„)
  • ๋ณด์™„ : ๋งŒ์•ฝ์„ ๋Œ€๋น„ํ•ด ๋ฏธ๋ฆฌ n๊ฐœ์˜ ์ž๋ฆฌ๋ฅผ ์˜ˆ์•ฝํ•œ๋‹ค
    • ํ•œ๊ณ„ 1 : ๋งŒ์•ฝ์˜ ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธฐ์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋‚ญ๋น„ํ•˜๊ฒŒ ๋จ
    • ํ•œ๊ณ„ 2 : n๊ฐœ๋ณด๋‹ค๋„ ๋ฐฐ์—ด์ด ์ปค์ง„๋‹ค๋ฉด ๋˜ ๋‹ค์‹œ ๋ชจ๋“  ์›์†Œ๋ฅผ ์˜ฎ๊ฒจ์•ผ ํ•จ

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ (linked list)

  • ๋ณด๋ฌผ์ฐพ๊ธฐ์— ๋น„์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • 1๋ฒˆ์งธ ์žฅ์†Œ๋กœ ๊ฐ€๋ฉด '๋‹ค์Œ์œผ๋กœ 2๋ฒˆ์งธ ์žฅ์†Œ ~ ๋กœ ๊ฐ€์‹œ์˜ค', 2๋ฒˆ์งธ ์žฅ์†Œ๋กœ ๊ฐ€๋ฉด '๋‹ค์Œ์œผ๋กœ 3๋ฒˆ์งธ ์žฅ์†Œ ~๋กœ ๊ฐ€์‹œ์˜ค' ...
  • ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ์‚ฌ์šฉ ์‹œ, ์›์†Œ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์˜ ์–ด๋Š ๊ณณ์—๋‚˜ ๋‘˜ ์ˆ˜ ์žˆ๋‹ค.
    • ์˜ํ™” ๋ณด๋Ÿฌ ๊ฐ€์„œ 4๋ช…์ด ๋ถ™์–ด ์•‰์„ ์ˆ˜ ์žˆ๋Š” ์ž๋ฆฌ๊ฐ€ ์—†๋‹ค๋ฉด ๊ฐ์ž ํฉ์–ด์ ธ์„œ ์˜ํ™”๋ฅผ ๋ณด๋Š” ๊ฒƒ๊ณผ ๋น„์Šท.
  • ๊ฐ ์›์†Œ๋งˆ๋‹ค ๋ฆฌ์ŠคํŠธ์˜ ๋‹ค์Œ ์›์†Œ์— ๋Œ€ํ•œ ์ฃผ์†Œ๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋‹ค.
  • ์žฅ์  : INSERT, DELETE๊ฐ€ ๋น ๋ฅด๋‹ค.
    • INSERT - ๋ฉ”๋ชจ๋ฆฌ์˜ ์•„๋ฌด ๊ณณ์—๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ณ , ๊ทธ ์ฃผ์†Œ๋ฅผ ๋ฐ”๋กœ ์•ž ์›์†Œ์— ์ €์žฅํ•˜๋ฉด ๋จ (O(1), ๊ณ ์ • ์‹œ๊ฐ„)
    • ์ˆœ์„œ๋ฅผ ๋ฐ”๊ฟ€ ๋•Œ๋„ ์ฃผ์†Ÿ๊ฐ’๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋˜๋ฏ€๋กœ ๋งค์šฐ ์‰ฝ๋‹ค.
    • DELETE - ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฐ์ดํ„ฐ ์‚ญ์ œ ํ›„ ์•ž ์›์†Œ์—์„œ ์ฃผ์†Ÿ๊ฐ’์„ ์‚ญ์ œํ•˜๋ฉด ๋˜๋ฏ€๋กœ ๋น ๋ฆ„ (O(1), ๊ณ ์ • ์‹œ๊ฐ„)
  • ๋‹จ์  : READ๊ฐ€ ๋Š๋ฆฌ๋‹ค.
    • ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์ฃผ์†Œ๋ฅผ ๋ฐ”๋กœ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ๊ทธ ๋ฐ์ดํ„ฐ์˜ ์ฃผ์†Ÿ๊ฐ’์„ ๊ฐ€์ง„ ์ด์ „ ๋ฐ์ดํ„ฐ๋“ค์„ ์ „๋ถ€ ์ฐพ์•„์•ผ ํ•จ (O(n), ์„ ํ˜• ์‹œ๊ฐ„)
    • ๋ชจ๋“  ์›์†Œ์˜ ๊ฐ’์„ ํ•œ ๋ฒˆ์— ์ฝ๋Š” ๋ฐ์—๋Š” ์ข‹์ง€๋งŒ, ํŠน์ • ์›์†Œ๋ฅผ ์กฐํšŒํ•  ๋•Œ๋Š” ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” ์ตœ์•…์ž„.

์ธ๋ฑ์Šค index

์›์†Œ์˜ ์œ„์น˜ ๋ฒˆํ˜ธ. 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค.

[10, 20, 30, 40] ์ด๋ผ๋Š” ๋ฐฐ์—ด์—์„œ, ์›์†Œ 20์€ ์ธ๋ฑ์Šค 1์— ์žˆ๋‹ค.

์ž„์˜ ์ ‘๊ทผ vs ์ˆœ์ฐจ ์ ‘๊ทผ

์ž„์˜ ์ ‘๊ทผ random access

  • ์กฐํšŒ๋ฅผ ์œ„ํ•ด ํ•ด๋‹น ์›์†Œ๋กœ ๋ฐ”๋กœ ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ์‹ (ex. ๋ฐฐ์—ด)

์ˆœ์ฐจ ์ ‘๊ทผ sequential access

  • ์กฐํšŒ๋ฅผ ์œ„ํ•ด ์›์†Œ๋ฅผ ์ฒซ ๋ฒˆ์งธ๋ถ€ํ„ฐ ํ•˜๋‚˜์”ฉ ์ฝ๋Š” ๋ฐฉ์‹ (ex. ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ)

์„ ํƒ ์ •๋ ฌ selection sort

์–ด๋–ค ๋ชฉ๋ก์„ ์ •๋ ฌํ•˜๊ธฐ ์œ„ํ•ด ์›์†Œ๋งˆ๋‹ค ์ „์ฒด ๋ฆฌ์ŠคํŠธ๋ฅผ ์กฐํšŒํ•˜๊ณ , ์ƒˆ ๋ชฉ๋ก์— ์ด๋ฅผ ๊ธฐ๋กํ•จ.

๋™์ž‘์›๋ฆฌ

์˜ˆ๋ฅผ ๋“ค์–ด ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŽ์ด ๋“ค์€ ๊ณก - ์ ๊ฒŒ ๋“ค์€ ๊ณก ์ˆœ์„œ๋กœ ์ •๋ ฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ,

  1. ์ „์ฒด ๋ชฉ๋ก์„ ๋Œ๋ฉฐ ๊ฐ€์žฅ ๋งŽ์ด ๋“ค์€ ๊ณก์„ ์ฐพ๋Š”๋‹ค (O(n))
  2. ์ƒˆ ๋ชฉ๋ก์— ๊ทธ ๊ณก์„ ๊ธฐ๋กํ•œ๋‹ค
  3. ์ „์ฒด ๋ชฉ๋ก์„ ๋Œ๋ฉฐ ๋‘ ๋ฒˆ์งธ๋กœ ๋งŽ์ด ๋“ค์€ ๊ณก์„ ์ฐพ๋Š”๋‹ค (O(n))
  4. ์ƒˆ ๋ชฉ๋ก์— ๊ทธ ๊ณก์„ ๊ธฐ๋กํ•œ๋‹ค
  5. ๋ชฉ๋ก ์ „์ฒด๋ฅผ ์ •๋ ฌํ•  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.

์‹œ๊ฐ„ ๊ณ„์‚ฐ : ๋ชฉ๋ก์˜ ๋ชจ๋“  ์›์†Œ๋ฅผ ์กฐํšŒํ•˜๋Š” ์ž‘์—…์„ ์›์†Œ์˜ ๊ฐฏ์ˆ˜๋งŒํผ ๋ฐ˜๋ณตํ•จ. ๋”ฐ๋ผ์„œ O(n x n) = O(n์ œ๊ณฑ) ๋งŒํผ ๊ฑธ๋ฆผ.

โ€ป ๋งค ๋ฐ˜๋ณต๋งˆ๋‹ค ์กฐํšŒํ•  ๋ชฉ๋ก์€ ์ค„์–ด๋“ค์ง€๋งŒ, ๋น…์˜คํ‘œ๊ธฐ๋ฒ•์—์„œ๋Š” ์ƒ์ˆ˜ํ•ญ์„ ๋ฌด์‹œํ•˜๊ธฐ ๋•Œ๋ฌธ์— O(n์ œ๊ณฑ) ์œผ๋กœ ํ‘œ๊ธฐํ•œ๋‹ค.

ํŠน์ง•

๊น”๋”ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด์ง€๋งŒ ๋น ๋ฅด์ง€ ์•Š๋‹ค.

์„ ํƒ์ •๋ ฌ ์ฝ”๋“œ

๋ฐฐ์—ด์„ ์ž‘์€ ์ •์ˆ˜์—์„œ ํฐ ์ •์ˆ˜ ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๋Š” ์ฝ”๋“œ.

๋ฐฐ์—ด์—์„œ ๊ฐ€์žฅ ์ž‘์€ ์›์†Œ๋ฅผ ์ฐพ๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๊ณ , ๊ทธ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ์ •๋ ฌํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ƒˆ ๋ฐฐ์—ด์— ๋‹ด๋Š”๋‹ค.

def findSmallest(arr):
    smallest = arr[0]
    smallest_index = 0
    for i in range(1, len(arr)):
        if arr[i] < smallest: ## ์„ค์ •ํ•œ ์ตœ์†Ÿ๊ฐ’๋ณด๋‹ค ๋ฐฐ์—ด์˜ i๋ฒˆ์งธ ๊ฐ’์ด ์ž‘๋‹ค๋ฉด
            smallest = arr[i] ## ๊ทธ ๊ฐ’์ด ์ตœ์†Ÿ๊ฐ’์ด ๋œ๋‹ค
            smallest_index = i
    return smallest_index

def selectionSort(arr):
    newArr = []
    for i in range(len(arr)):
        smallest = findSmallest(arr)
        newArr.append(arr.pop(smallest))
    return newArr

print selectionSort([5, 3, 6, 2, 10])