๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Python/Algorithm with Python

[1. ์ž๋ฃŒ๊ตฌ์กฐ ์ด๋ก ] ๋ฐฐ์—ด(List), Queue, Stack

by ๐Ÿ’œautumn 2020. 9. 14.

1. ๋ฐฐ์—ด 

   : ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜์—ดํ•˜๊ณ , ๊ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ธ๋ฑ์Šค์— ๋Œ€์‘ํ•˜๋„๋ก ๊ตฌ์„ฑํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ

   : ํŒŒ์ด์ฌ์€ ๋ณ„๋„์˜ Arrayํƒ€์ž…์ด ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ list๋ฅผ ํ™œ์šฉ

   : ๊ฐ™์€ ์ข…๋ฅ˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ์œ„ํ•ด ์‚ฌ์šฉ

      โžก๏ธŽ ์ˆœ์ฐจ์ ์œผ๋กœ ์ €์žฅ (์—ฐ์†๋˜๊ณ  ์—ฐ๊ฒฐ๋œ ๊ณต๊ฐ„์— ์ €์žฅ)

      โžก๏ธŽ ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด ๊ฐ๊ฐ์˜ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผ ๊ฐ€๋Šฅ

    : ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•œ ๋น ๋ฅธ ์ ‘๊ทผ ๊ฐ€๋Šฅ : ์ฒซ๋ฒˆ์งธ ์œ„์น˜์—์„œ ์ƒ๋Œ€์ ์ธ ์œ„์น˜๋กœ ์ ‘๊ทผ

    : ๊ฐ€๋ณ€์  ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ์•„๋‹˜ (immutable) - ์ดˆ๊ธฐ์— ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ ์„ค์ •ํ•ด์•ผํ•จ

    : ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ ๋ฐ ์‚ญ์ œ๊ฐ€ ์–ด๋ ค์›€ : ๊ธฐ์กด ๊ธธ์ด ์ดˆ๊ณผ์‹œ ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ ์–ด๋ ค์›€, ์ค‘๊ฐ„ ๋ฐ์ดํ„ฐ ์‚ญ์ œ์‹œ ๋ฐ์ดํ„ฐ ์žฌ์ •๋ ฌ ํ•„์š”

   * ํŒŒ์ด์ฌ์—์„œ์˜ ๋ฐฐ์—ด

      : list๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ˜„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธธ์ด ์ง€์ • ํ•„์š”์—†์Œ, ๊ฐ€๋ณ€์ ์ด๊ฒŒ ์‚ฌ์šฉ๊ฐ€๋Šฅ

      : ๋ฐฐ์—ด ์ƒ์„ฑ

       1) python_list=[1,2,3] โ‡จ ์ง์ ‘ ๋Œ€๊ด„ํ˜ธ ์•ˆ์— ์ž‘์„ฑ

       2) python_list=list() โ‡จ ๋นˆ ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ

      : ๋ฐฐ์—ด ์š”์†Œ ์ถ”๊ฐ€ โ‡จ append(data)

      : ๋ฐฐ์—ด ์š”์†Œ ์‚ญ์ œ โ‡จ del python_list[index]

# ๋ฐฐ์—ด ์ƒ์„ฑ
# ๋ฐฉ๋ฒ•1) list() ์‚ฌ์šฉํ•˜์—ฌ ๋นˆ ๋ฐฐ์—ด ์„ ์–ธ
data_list = list()
print(data_list)  #[]
# ๋ฐฉ๋ฒ•2) ๊ฐ„๋‹จํžˆ ๋Œ€๊ด„ํ˜ธ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด ์„ ์–ธ
data_list = [1,2,3,4]
print(data_list)  #[1,2,3,4]

# ๋ฐฐ์—ด๊ฐ’ ์ถ”๊ฐ€
# list.append(data)
data_list.append(5)
print(data_list)  #[1,2,3,4,5]

# ๋ฐฐ์—ด๊ฐ’ ์‚ญ์ œ
# del list[index]
del data_list[0]
print(data_list)  #[2,3,4,5]

    

 

 

2. ํ(Queue)

   : FIFO(First in First Out) - ์„ ์ž…์„ ์ถœ ๊ตฌ์กฐ

   : ํŠน์ • ์ˆœ์„œ์˜ ์ž๋ฃŒ๋ฅผ ์ถ”์ถœํ•˜๋Š”๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ฌด์กฐ๊ฑด ์ˆœ์ฐจ์  ์ฒ˜๋ฆฌ

   : ๋งคํ‘œ์†Œ ์•ž์— ์ค„์„ ์„œ๊ณ  ํ‘œ๋ฅผ ๊ตฌ๋งคํ•˜๋Š” ์ˆœ์„œ๋ฅผ ๊ธฐ์–ต!

   : ํ”„๋กœ์„ธ์Šค ์Šค์ผ€์ค„๋ง ๋ฐฉ์‹ ๊ตฌํ˜„์‹œ ์ฃผ๋กœ ์‚ฌ์šฉ

     * ํŒŒ์ด์ฌ์—์„œ ํ ๊ตฌํ˜„

      : ํ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ โžก๏ธŽ import queue

      : ๋‹ค์–‘ํ•œ ๊ตฌ์กฐ์˜ ํ๋ฅผ ์ง€์›

         1) Queue() : ์ผ๋ฐ˜์ ์ธ FIFO๊ตฌ์กฐ์˜ ํ

         2) LifoQueue() : ์Šคํƒ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ์˜ ํ - ๋‚˜์ค‘์— ์ž…๋ ฅ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋จผ์ € ์ถ”์ถœ๋˜๋Š” ๊ตฌ์กฐ

         3) PriorityQueue() : ๋ฐ์ดํ„ฐ๋งˆ๋‹ค ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ง€์ •ํ•˜๊ณ  ๊ทธ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ์ˆœ์œผ๋กœ ๋ฐ์ดํ„ฐ ์ถ”์ถœ - ์ €์žฅ์ˆœ์„œ ๋ฌด์˜๋ฏธ(๋‚ฎ์„์ˆ˜๋ก ๋†’์€๊ฒƒ)

# ํ์ƒ์„ฑ ์œ„ํ•ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ
import queue
# 1) FIFO Queue
data_queue=queue.Queue()
# 2) LIFO Queue
data_queue=queue.LifoQueue()
# 3) Priority Queue
data_queue=queue.PriorityQueue()

     : ํ ๋ฐ์ดํ„ฐ ์‚ฝ์ž… โ‡จ Queue.put(data)

     : ํ ๋ฐ์ดํ„ฐ ์ถ”์ถœ โ‡จ Queue.get()

import queue
data_queue=queue.Queue()
# FIFO,LIFO์‚ฝ์ž…์‹œ : put
data_queue.put(100)
data_queue.put("korea")
print(data_queue) # [100, "Korea"]

# Priority ์‚ฝ์ž…์‹œ ํŠœํ”Œ๋‹จ์œ„๋กœ! ์ฆ‰, ๊ด„ํ˜ธ๋กœ ๋ฌถ์–ด์„œ (์šฐ์„ ์ˆœ์œ„,๊ฐ’)์œผ๋กœ ์‚ฝ์ž…
prior_queue=queue.PriorityQueue()
prior_queue.put((1,"Nate"))
prior_queue.put((15,"Peter"))
prior_queue.put((8,"Brad"))

# ๋ฐ์ดํ„ฐ ์ถ”์ถœ์‹œ : get()
data_queue.get()   #100
data_queue.get()   #Korea
prior_queue.get()  #Nate
prior_queue.get()  #Brad
prior_queue.get()  #Peter

     * ํŒŒ์ด์ฌ queue ๋‚ด์žฅํ•จ์ˆ˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  list๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ ๊ตฌํ˜„

queue_list = list()

def enqueue(data):
    queue_list.append(data)
    
def dequeue():
    data = queue_list[0]
    del queue_list[0]
    return data

 

 

3. ์Šคํƒ(Stack)

   : LIFO(Last in First Out) - ํ›„์ž…์„ ์ถœ ๊ตฌ์กฐ

   : ํŠน์ • ์ˆœ์„œ์˜ ์ž๋ฃŒ๋ฅผ ์ถ”์ถœํ•˜๋Š”๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ฌด์กฐ๊ฑด ์ˆœ์ฐจ์  ์ฒ˜๋ฆฌ

   : ์ ‘์‹œ๋ฅผ ์ฐจ๊ณก์ฐจ๊ณก ์Œ“๊ณ  ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ์Œ“์€ ์ ‘์‹œ ๋จผ์ € ํ™œ์šฉํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๋™์ผ

   : ๊ตฌ์กฐ๊ฐ€ ๋‹จ์ˆœํ•˜์—ฌ ๊ตฌํ˜„์ด ์‰ฝ๊ณ , ๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐ ์ฝ๊ธฐ ์†๋„ ์šฐ์ˆ˜

      โžก๏ธŽ ๋‹จ, ๋ฐ์ดํ„ฐ ์ €์žฅ ๊ฐœ์ˆ˜(์žฌ๊ท€ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ฐœ์ˆ˜)๋ฅผ ๋ฏธ๋ฆฌ ์ •ํ•ด์•ผํ•˜๋ฉฐ ์ œํ•œ์ ์ž„ : ๊ณต๊ฐ„ ๋‚ญ๋น„ ๋ฐœ์ƒ ์šฐ๋ ค

   : ์ปดํ“จํ„ฐ ๋‚ด๋ถ€ ํ”„๋กœ์„ธ์Šค ์‹คํ–‰ ๊ตฌ์กฐ์˜ ๊ธฐ๋ณธ ๋ฐ ์žฌ๊ท€ํ•จ์ˆ˜์‹œ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ์ •์ฑ…

     * ํ”„๋กœ์„ธ์Šค ์‹คํ–‰๊ตฌ์กฐ ํ‘œํ˜„ with ์žฌ๊ท€ํ•จ์ˆ˜

def recursive(data):
    if data < 0:
        print ("the end")
    else:
        print(data)
        recursive(data-1)
        print("returned", data)  
        
recursive(4)
'''
4
3
2
1
0
ended
returned 0
returned 1
returned 2
returned 3
returned 4
'''

 

     * ํŒŒ์ด์ฌ์—์„œ ์Šคํƒ ๊ตฌํ˜„

      : list๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๋ฉฐ, ์ด๋ฏธ list๋‚ด์žฅํ•จ์ˆ˜์ธ append(d)๋ฅผ ํ†ตํ•ด put๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ณ  pop()๊ธฐ๋Šฅ์„ ํ†ตํ•ด pop๊ธฐ๋Šฅ์„ ์‚ฌ์šฉ

data_stack = list()
data_stack.append(1)
data_stack.append(2)
print(data_stack)  #[1,2]

data_stack.pop()   #2
print(data_stack)  #[1]

     * ํŒŒ์ด์ฌ list ๋‚ด์žฅํ•จ์ˆ˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์Šคํƒ ํ•จ์ˆ˜ ๊ตฌํ˜„

stack_list = list()

def push(data):
    stack_list.append(data)

def pop():
    #๋’ค์—์„œ ์ธ๋ฑ์Šค ์„ธ๋Š” ๊ฒฝ์šฐ -1๋ถ€ํ„ฐ -1์”ฉ!
    data = stack_list[-1]
    del stack_list[-1]
    return data

๋Œ“๊ธ€