본문 바로가기
카테고리 없음

[TIL]24.03.08 내일배움캠프+ 스택(stack)

by Byeong 2024. 3. 8.

스택(stack) 

 

스택(stack)은 '쌓아놓은 더미'라고 하는데 과자 프링글스를 생각하면 좋다.

가장 먼저 들어간 과자는 맨 마지막에 나올 수 있고

가능 늦게 들어간 과자는 가장 먼저 나올 수 있다.

 

이처럼 데이터도 프링글스 과자와 같다.

재귀함수는 다른 함수들을 이해하기 위해서는 스택을 이해하고 넘어가야 한다.

 

스택의 추상데이터는 암기해 두고 알고리즘 문제를 풀며 점차 이해도를 높여가야겠다.

 

__init__ : 스텍을 초기화

push() : 아이템 추가

pop(): 아이템 제거 및 출력

peek() : 맨위의 요소 삭제 안 하고 반환

is_empty : 스택여부를 혹인하고 Ture or False 반환

size() : 아이템 개수 봔환

 

 

 

스택 문제 

"""
- 스택 문제 1
    - 키보드 Backspace 기능 구현
    - input_string = ‘123//45/6789///’
        - /를 만나면 앞의 값을 삭제
        - 참고 - 맨앞에 /만나면 어떻게 처리해야 되는지 생각 해보기
    - answer = ‘146’
"""




def backspace_string(input_string):
     stack = []
     for i in input_string:
         if i == '/':
             if len(stack) > 0:
              if stack:
                 stack.pop()
         else:
             stack.append(i)
     return ''.join(stack)
    


print(backspace_string("123//45/6789///"))
print(backspace_string("/987////65/432//1/"))

 

 

키보드의 backspace를 구현 한 문제이다.

처음에. pop()의 사용방법을 잘 몰라 구글에 검색하고서야 진행이 가능했다.

 

하지만 문제가 두 번제 에시 출력 문자열의 시작이 '/'로 시작한다.

if stack:
   stack.pop()

첫 if문에서 한 번 더 걸러 주는 위와 같은 조건문을 사용하지 않으면 

 

아래와 같은 에러가 발생한다.

IndexError: pop from empty list

 

list에 아무것도 없는데 어떻게 리시트의 값을 pop 하냐 이다.

 

그래서 위와 같은 if문을 사용해 줘 stack이 False이라면 pop 하지 말라는 조건문을 넣어 줬다.

if len(stack) > 0:

 

이런 식으로도 풀이가 가능한데 

list의 구조를 이용한다면 stack = [''] 안에 아무것도 없는 배열이기 때문에 False이 된다.

 

 

마무리 

튜터님이 자료형의 이해를 높여야 한다고 하셨는데 이번 문제를 풀며 더욱 뼈저리게 느끼게 됐다. 

자료형과 스택, 재귀함수 등 먼저 이해도를 높여야겠다.