반응형

재귀함수(Recursive function) : 자기 자신을 부르는 함수

리스트(List) : 동적인 배열 (튜플(tuple) : 정적인 배열)

LIFO : Last in Fisrt out

 

스택(stack) : 일종의 바닥이 막힌 상자 혹은 더미, 나중에 넣은 물건은 나중에 꺼낼 수 밖에 없는 구조,

LIFO(Last In First Out) 라고도 한다.

 

스택(Stack) : 더미

재귀함수를 이용해서 이 스택구조를 구현하겠습니다. (Push는 자료를 입력, Pop은 자료를 출력)

#재귀함수를 이용한 스택구조
def stack(start , end):
    if start <= end:
        print('Push :', start)
        stack(start + 1, end)
        print("Pop  :", start)
    else:
        print("--------")

stack(0, 5)

#결과
Push : 0
Push : 1
Push : 2
Push : 3
Push : 4
Push : 5
--------
Pop  : 5
Pop  : 4
Pop  : 3
Pop  : 2
Pop  : 1
Pop  : 0

짧은 코딩이지만, 조금은 생각해야 합니다.

 

 

List를 이용하여 간단히 스택구조를 구현할 수 있습니다.

#List를 이용한 스택구조
data_stack = list()

for i in range(10):
    data_stack.append(i)
    print('Push :', data_stack)

for i in range(10):
    data_stack.pop()
    print('Pop  :', data_stack)
    
#결과
Push : [0]
Push : [0, 1]
Push : [0, 1, 2]
Push : [0, 1, 2, 3]
Push : [0, 1, 2, 3, 4]
Push : [0, 1, 2, 3, 4, 5]
Push : [0, 1, 2, 3, 4, 5, 6]
Push : [0, 1, 2, 3, 4, 5, 6, 7]
Push : [0, 1, 2, 3, 4, 5, 6, 7, 8]
Push : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Pop  : [0, 1, 2, 3, 4, 5, 6, 7, 8]
Pop  : [0, 1, 2, 3, 4, 5, 6, 7]
Pop  : [0, 1, 2, 3, 4, 5, 6]
Pop  : [0, 1, 2, 3, 4, 5]
Pop  : [0, 1, 2, 3, 4]
Pop  : [0, 1, 2, 3]
Pop  : [0, 1, 2]
Pop  : [0, 1]
Pop  : [0]
Pop  : []

 

좀 더 직관적이고, 간단한 방법으로 스택구조를 구현할 수 있습니다. 

 

스택구조는 많은 곳에서 사용됩니다.

 

윈도우에서 Ctrl+Z,  브라우저에 뒤로 가기 등 스택구조로 동작합니다. 

 

간단한 구조이지만, 많이 쓰이기 때문에 반드시 알아야 하는 구조입니다.

728x90
반응형
반응형

버블 정렬(Bubble Sort) : 서로 인접한 두 원소를 검사하여  정렬하는 알고리즘

 

 

거품처럼 수면으로 올라오는 모습

 

 

문제 : 9~0까지 배열 을 버블 정렬을 사용하여 오름차순으로 정렬하라!

 

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

for i in range(0, len(num)-1):
    if i != len(num)-1:
        for j in range(i+1, len(num)):
            if num[i] > num[j]:
                temp = num[i]
                num[i] = num[j]
                num[j] = temp
        print(num)
        
#결과
[0, 9, 8, 7, 6, 5, 4, 3, 2, 1]
[0, 1, 9, 8, 7, 6, 5, 4, 3, 2]
[0, 1, 2, 9, 8, 7, 6, 5, 4, 3]
[0, 1, 2, 3, 9, 8, 7, 6, 5, 4]
[0, 1, 2, 3, 4, 9, 8, 7, 6, 5]
[0, 1, 2, 3, 4, 5, 9, 8, 7, 6]
[0, 1, 2, 3, 4, 5, 6, 9, 8, 7]
[0, 1, 2, 3, 4, 5, 6, 7, 9, 8]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

 

코드가 단순하지만, 속도는 느립니다. 하지만 알고리즘 공부하기에 괜찮은 정렬입니다. 

728x90
반응형
반응형

안녕하세요. 

 

오늘은 파이썬 기본 문법인 List와 Dict을 활용한 면접 문제 코딩을 하나 작성하도록 하겠습니다. 

 

tuple( ( ) 사용) : 일반적으로 배열(정적할당)처럼 사용된다. 그러므로 불가변적으로 변수를 집어넣을 수 없다.

List( [ ] 사용 ) : 일반적으로 배열(동적할당)처럼 사용된다. 그러므로 가변적으로 변수를 집어 넣을 수 있다.

Dict( { } 사용) : List와 달리 Index도 입력해야한다.

 

그렇다면 Dictionary은 왜 사용하는가? 

 

그 이유는 데이터 처리에 있어 Dict은 프로그래머가 이미 Index를 알고 있어, 바로 해당하는 데이터로 접근합니다.

 

List는 배열 구조로서 크기가 10(0~9)인 List가 있다고 가정하게 되면, 9번 데이터에 접근하기 위해 순차적으로 인덱스가 0부터 8까지 모두 접근을 한 이 후에 9번에 접근하게 됩니다. 

 

List는 9번을 메모리에 들락날락한다면, 

 

DIctionary는 단, 1번으로 자신이 원하는 메모리에 접근할 수 있습니다. 

 

그러므로 List에 비해 DIct의 속도가 더 빠릅니다. 메모리의 사이즈가 더 커진다면 그 속도의 차이는 더욱 커질 것입니다.

 

 

문제 : List : 사과, 바나나, 딸기, 키위, 복숭아의 갯수가 몇개인가? 

 

#list
fruits = ["사과", "사과", "바나나", "바나나", "딸기", "키위", "복숭아", "복숭아", "복숭아"]

#dict
dict = {}

for fruit in fruits:
	if fruit in dict:
    		dict[fruit] = d[fruit] +1
	else:
		dict[fruit] = 1
        
print(dict)

#결과 : {'사과': 2, '바나나': 2, '딸기': 1,'키위': 1, '복숭아': 3}

 

 

처음에  정답을 봤을 때, 정말 간단한 코딩이지만 List와 Dict에 정확히 이해해야만 풀 수 있는 문제입니다.

 

학기를 시작하여 매일은 아니지만 주에 몇 번씩 파이썬 면접문제를 몇 개씩 올려서 풀어볼려고 합니다.

728x90
반응형

+ Recent posts