>

TIL

3주차 Day 5. Stack, unpacking operator *

ekdud 2024. 7. 12. 20:27

🤍

    Stack

    - LIFO: 가장 마지막에 넣은 데이터가 가장 빨리 나온다. Last In First Out.

    https://www.geeksforgeeks.org/lifo-principle-in-stack/

     

     

    - 구현: push, pop, is_empty 세가지 메소드가 필요

    class Node:
        def __init__(self, item, next):
            self.item = item
            self.next = next
    
    
    class Stack:
        def __init__(self):
            self.top = None
    
        def is_empty(self):
            return self.top is None
    
        def push(self, val):
            self.top = Node(val, self.top)
    
        def pop(self):
            if not self.top:
                return None
    
            node = self.top
            self.top = self.top.next
            return node.item

     


    괄호문자열 문제

    # 백준_9012번 문제

    괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고 부른다. 한 쌍의 괄호 기호로 된 “( )” 문자열은 기본 VPS 이라고 부른다. 만일 x 가 VPS 라면 이것을 하나의 괄호에 넣은 새로운 문자열 “(x)”도 VPS 가 된다. 그리고 두 VPS x 와 y를 접합(concatenation)시킨 새로운 문자열 xy도 VPS 가 된다. 예를 들어 “(())()”와 “((()))” 는 VPS 이지만 “(()(”, “(())()))” , 그리고 “(()” 는 모두 VPS 가 아닌 문자열이다. 입력으로 주어진 괄호 문자열이 VPS 인지 아닌지를 판단해서 그 결과를 YES 와 NO 로 한 줄에 하나씩 차례대로 출력해야 한다.

     

    입력 데이터는 표준 입력을 사용한다. 입력은 T개의 테스트 데이터로 주어진다. 입력의 첫 번째 줄에는 입력 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터의 첫째 줄에는 괄호 문자열이 한 줄에 주어진다. 하나의 괄호 문자열의 길이는 2 이상 50 이하이다. 

    T = int(input())
    answer = []
    
    for i in range(T):
        stack=[]
        s = input()
        for i in s :
            if i == '(' :
                stack.append(i)
            elif i == ')' :
                if len(stack) != 0:
                    stack.pop()
                else :
                    answer.append("NO")
                    break
        else :
            if len(stack) == 0:
                answer.append("YES")
            else :
                answer.append("NO")
    
    print(*answer, sep='\n')

     

    입력 / 출력

     


    괄호문자열 문제2 (leetcode)

    Given a string s containing just the characters '(', ')', '{', '}', '[' and ']', determine if the input string is valid.

    An input string is valid if:
    1. Open brackets must be closed by the same type of brackets.
    2. Open brackets must be closed in the correct order.
    3. Every close bracket has a corresponding open bracket of the same type.

    class Solution:
        def isValid(self, s: str):        
        # def is_valid(s):
            pair = {
                '}':'{',
                ']':'[',
                ')':'('
            }
            opener = "({["
            stack = []
    
            for char in s:
                if char in opener:
                    stack.append(char)
                else:
                    if not stack:
                        return False
                    top = stack.pop()
                    if pair[char] != top:
                        return False
    
            return not stack

     


    파이썬 리스트를 한 줄에 하나씩 출력하는 방법

    1) for문 이용하기

    2) unpacking operator * 와 sep옵션 이용하기 

     temp = [1, 2, 3, 4, 5] 

     print(*temp, sep = '\n') 

       >>>

             

             

             

             

     

    리스트의 빈 문자열 원소 제거하기 

    (사실 코드 테스트해보는데 자꾸 답이 오류가 나서.. 입력값에 공백이 들어있나해서 알아봄..ㅎㅎ)

     

    1) join(), split() 함수 이용

     a_list = ' '.join(a_list).split()

     

    2) filter()함수 이용

     a_list = list(filter(None, a_list))

     

    3) list comprehension

     a_list = [i for i in a_list if i]

     


     

    ALGORITHM CODE KATA

    (school.programmers.co.kr)

     

    Ⅰ. 단어 s의 가운데 글자를 반환하는 함수, solution을 만들어 보세요. 단어의 길이가 짝수라면 가운데 두글자를 반환하면 됩니다.

    def solution(s):
        answer = ''
        leng = len(s)
        list = [i for i in s]
        if leng % 2 == 0:
            answer = list[leng//2-1] + list[leng//2]
        else:
            answer = list[leng//2]
            
        return answer

     

    다른 분들은 어떻게 작성하셨나 봤는데, 내가 왜 이럴 생각을 못했지🐸 조건문 없이도 충분히 가능하더라.. 나 이정도면 조건문 중독이야 ↴

    define solution(s):
    	return s[(len(s)-1)//2 : len(s)//2 + 1]

    (좌) 내가 작성한 코드 실행시간   (우) 다른 분이 작성하신 코드 실행시간

     

    Ⅱ. 길이가 n이고, "수박수박수박수...."와 같은 패턴을 유지하는 문자열을 리턴하는 함수, solution을 완성하세요. 예를들어 n이 4이면 "수박수박"을 리턴하고 3이라면 "수박수"를 리턴하면 됩니다.

    def solution(n):
        answer = ''.join(['수' if i % 2 == 0 else '박' for i in range(n)])
        
        return answer

     

    다른 풀이도 찾아봤는데 zip 함수를 사용하는 방법이 있었다. zip함수가.. 쉽게 생각이 안난다.

    def solution(a, b):
        return sum([x*y for x, y in zip(a,b)])

     

    // 틈새 정리

    zip(iterable) - 리스트나 튜플 같은 순회가능한(iterable) 객체를 인자로 받아 각각의 요소들을 나눈 후, 인덱스별로 잘라서 리스트로 반환해준다.

     

    다양한 함수를 써보도록 노력해야겠다. 내 코드와 비교했을 때 실행시간 측면에서 유의미한 차이는 없는 듯 하다.

    내 풀이 / 다른 풀이