제육's 휘발성 코딩
Published 2021. 9. 5. 17:20
큐, 스택 PYTHON/Algorithm
반응형

자료구조

  • 대량의 데이터를 효율적으로 관리할 수 있는 데이터의 구조를 의미
  • 어떤 데이터 구조를 사용하느냐에 따라, 코드 효율이 달라진다.
  • 대표적인 자료구조 (배열, 스택, 큐, 링크드 리스트, 해쉬 테이블, 힙 등)

알고리즘

  • 어떤 문제를 풀기 위한 절차 / 방법
  • 어떤 문제에 대한 원하는 출력을 얻을 수 있도록 만드는 프로그래밍

어떤 자료구조와 알고리즘을 사용하느냐에 따라 성능이 천지차!

파이썬과 C언어의 배열 예제

#include <stdio.h>

int main(int args, char* argv[])){
    char country[3] = "US";
    printf("%c%c\n", country[0], country[1]);
    printf("%s\n", country);
    return 0;
}
country = 'US'
print(country)

country = country + 'A'
print(country)

파이썬과 배열

  • 파이썬 리스트 활용

1차원 배열 - 리스트

data = [1,2,3,4,5]
print(data)

2차원 배열 - 리스트

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

예제

  • dataset 리스트에서 M이 몇번 들어갔는지 계산
m_count = 0
for data in dataset:
    for index in range(len(data)):
        if data[index] == 'M':
            m_count += 1
print(m_count)

  • 줄을 서는 행위와 유사
  • 가장 먼저 넣은 데이터를 가장 먼저 꺼낼 수 있는 구조 (FIFO)
  • Enqueue: 큐에 데이터를 넣는 기능
  • Dequeue: 큐에서 데이터를 꺼내는 기능
  • 멀티 태스킹을 위한 프로세스 스케쥴링 방식을 구현하기 위해 많이 사용됨
    • 큐는 딱히 장단점으로 언급할 만한 것이 없다. 스케쥴링 방식 구현과 연관 되어있다 정도만 기억

라이브러리

  • Queue(): 가장 일반적인 큐 자료 구조
  • LifoQueue(): 나중에 입력된 데이터가 먼저 출력되는 구조 (스택 구조라고 보면 됨)
  • PriorityQueue(): 데이터마다 우선순위를 넣어서, 우선순위가 높은 순으로 데이터 출력

Queue

import queue

data_queue = queue.Queue()  
data_queue.put("funcoding") # put : 데이터 삽입
data_queue.put(1)
data_queue.qsize()    # 큐의 데이터 개수 
data_queue.get()    # 큐의 데이터 출력 

큐는 데이터를 꺼내올 때 특정 값을 꺼내 오지 않고 처음 들어온 값을 꺼내기 때문에 별도의 인자는 없다.

LifoQueue

import queue
data_queue = queue.LifoQueue()

스택과 같은 형태로 LIFO 구조를 갖게 된다.

PriorityQueue

import queue

data_queue = queue.PriorityQueue()
data_queue.put((10, "korea"))
data_queue.put((5, 1))
data_queue.put((15, "china"))
data_queue.get()    # 가장 높은 우선순위를 가진 (5, 1) 출력

데이터를 넣을 때 우선순위를 같이 부여해서 꺼내올 순위를 지정한다.

Enqueue, Dequeue

queue_list = list()

def enqueue(data):
    queue_list.append(data)

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

for index in range(10):
    enqueue(index)

len(queue_list)

dequeue()

리스트 변수로 큐를 다룬다.

스택

  • 한쪽 끝에서만 자료를 넣거나 뺄 수 있는 구조
  • 가장 나중에 쌓은 데이터를 가장 먼저 빼낼 수 있는 데이터 구조 (LIFO)

스택1

push : 데이터를 스택에 넣기

pop : 데이터를 스택에서 꺼내기

스택 구조는 프로세스 실행 구조의 가장 기본 - 함수 안에서 다른 함수가 동작하고 다른 함수가 먼저 종료

# 재귀 함수
def recursive(data):
    if data < 0:
        print("ended")
    else:
        print(data)
        recursive(data - 1)
        print("returned", data)

recursive(4)
  • 4, 3, 2 , 1 , 0 , ended, return 0 , 1, 2 , 3 ,4 출력
  • recursive(-1) 까지 호출이 돼야 한다.

스택 장단점

  • 장점
    • 구조가 단순해서 구현이 쉽다.
    • 데이터 저장 / 읽기 속도가 빠르다.
  • 단점 (일반적인 스택 구현시)
    • 데이터의 최대 갯수를 미리 정해야 한다.
      • 파이썬의 경우 재귀 함수는 1000번 까지만 호출 가능
    • 저장 공간의 낭비가 발생할 수 있다.
      • 미리 최대 갯수만큼 저장 공간을 확보해야 한다.

스택은 단순하고 빠른 성능을 위해 사용되므로, 보통 배열 구조를 활용해서 사용한다.

스택 예제

stack_list = list()

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

def pop():
    data = stack_list[-1]
    del stack_list[-1]
    return data
for index in range(10):
    push(index)
pop()

파이썬에선 기본적으로 pop() 을 제공하며 push 는 append로 사용한다.

반응형
profile

제육's 휘발성 코딩

@sasca37

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요! 맞구독은 언제나 환영입니다^^