alpyrithm_알파이리즘

[알고리즘][Python] 백준(BOJ) 10828 스택_파이썬 본문

Algorithm/백준 알고리즘_Python

[알고리즘][Python] 백준(BOJ) 10828 스택_파이썬

알파이 2020. 7. 10. 16:20

 

 

자료구조(1)

10828 스택    https://www.acmicpc.net/problem/10828

 

10828번: 스택

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 �

www.acmicpc.net

 

 

 

 

 

 

 

 

 

문제 풀기 전 공부할 것 : 스택

 

 

 

 

 

 

 

풀이 1

<내용>

cmd를 split() 하지 않으면 cmd[0]를 했을 때 'p', 't', 's', 'e'와 같이 하나의 알파벳을 가리킨다.

제일 최근 풀이

 

<코드>

import sys
input = sys.stdin.readline

def command(stk, cmd):
    cmd = cmd.split()
    if cmd[0] == 'push':
        stk.append(int(cmd[1]))
    elif cmd[0] == 'pop':
        if stk:
            print(stk.pop())
        else:
            print(-1)
    elif cmd[0] == 'size':
        print(len(stk))
    elif cmd[0] == 'empty':
        if stk:
            print(0)
        else:
            print(1)
    elif cmd[0] == 'top':
        if stk:
            print(stk[-1])
        else:
            print(-1)

def solution():
    n = int(input())
    stk = []
    for _ in range(n):
        cmd = input()
        command(stk, cmd)
        
if __name__ == '__main__':
    solution()

 

+) 밑에서 if __name__ == '__main__'의 의미를 알아보자.

 

 

풀이 2

<내용>

예전 풀이 1

각각 명령을 처리하는 함수를 만들었다.

 

<코드>

import sys

def push(st, num):
    num = int(num)
    st.append(num)
    
def pop(st):
    if not st:
        print(-1)
    else:
        print(st.pop())
        
def size(st):
    print(len(st))
    
def empty(st):
    if not st:
        print(1)
    else:
        print(0)
        
def top(st):
    if not st:
        print(-1)
    else:
        print(st[-1])
    
n = int(sys.stdin.readline())
st = []
for _ in range(n):
    x = sys.stdin.readline().rstrip()
    if 'push' in x:
        w, num = x.split()
        push(st, num)
    elif x == 'pop':
        pop(st)
    elif x == 'size':
        size(st)
    elif x == 'empty':
        empty(st)
    else:
        top(st)

 

 

 

 

 

 

 

풀이 3

<내용>

예전 풀이 2

for문이 아닌 while문으로 반복 대체

 

<코드>

import sys

n = int(input())
a = 0
l = []
while a < n:
    k = sys.stdin.readline().rstrip()
    if 'push' in k:
        k1, k2 = k.split()
        l.append(k2)
    elif k == 'pop':
        if not l: 
            print(-1)
        else:
            print(l.pop())
    elif k == 'size':
        print(len(l))
    elif k == 'empty':
        if not l:
            print(1)
        else:
            print(0)
    elif k == 'top':
        if not l:
            print(-1)
        else:
            print(l[-1])
    a += 1

 

 

 

 

풀이 4

<내용>

python의 list를 stack으로 사용하지 않고 stack class 정의하여 stack의 기능/명령들을 구현함

 

<코드>

#Stack class 정의
class Stack:
    def __init__(self):
        self.len = 0
        self.list = []
        
    def push(self, num):
        self.list.append(num)
        self.len += 1
    
    def pop(self):
        if self.size() == 0:
            return -1
        pop_result = self.list[self.len - 1]
        del self.list[self.len - 1]
        self.len -= 1
        return pop_result
        
    def size(self):
        return self.len
        
    def empty(self):
        return 1 if self.len == 0 else 0
        
    def top(self):
        return self.list[-1] if self.size() != 0 else -1

num = int(input())
stack = Stack()
for _ in range(num):
    cmd = input().split()
 
    op = cmd[0]
 
    if op == "push":
        stack.push(input_split[1])
    elif op == "pop":
        print(stack.pop())
    elif op == "size":
        print(stack.size())
    elif op == "empty":
        print(stack.empty())
    elif op == "top":
        print(stack.top())
    else:
        print("unacceptable op")

+) 밑에서 class에 대해서 더 알아보자.

 

 

 

 

 

 

 

 


 

 

복습 1

if __name__ == '__main__'

 

<내용>

- 사용 이유 : 현재 스크립트 파일이 실행되는 상태를 파악하기 위해 사용

- __name__은 파일은 __name__ 변수 값(모듈의 이름 저장값)이다.

- 파이썬 인터프리터로 스크립트 파일을 직접 실행했을 때는 모듈 이름이 아니라 '__main__'이 들어간다.

  • 어떤 스크립트 파일이든 파이썬 인터프리터가 최초로 실행한 스크립트 파일의 __name__에는 '__main__'이 들어간다. 이는 프로그램의 시작점(entry point)라는 뜻이다.
  • __name__ 변수를 통해 현재 스크립트 파일이 시작점인지 모듈인지 판단한다.

 

* if __name__ == '__main__' : __name__ 변수의 값이 '__main__' 인지 확인하는 코드는 현재 스크립트 파일이 프로그램의 시작점이 맞는지 판단하는 작업이다.

  • 스크립트 파일이 메인 프로그램으로 사용될 때와 모듈로 사용될 때를 구분하기 위한 용도이다.

 

 

 

 

 

 

복습 2

class 사용하기

 

- 객체(object) : 특정한 개념이나 모양으로 존재하는 것

- 클래스(class) : 프로그래밍으로 객체를 만들 때 사용하는 것

  • 속성(attribute) : 데이터
  • 메서드(method) : 기능

* 객체지향(object oriented) 프로그래밍 : 복잡한 문제를 잘게 나누어 객체로 만들고, 객체를 조합해서 문제를 해결한다.

→ 현실 세계의 복잡한 문제를 처리하는데 유용하며 기능을 개선하고 발전시킬 때도 해당 클래스만 수정하면 되므로 유지 보수에도 효율적이다.

 

 

- 클래스와 메서드 만들기

  • 메서드 : 클래스 안에 들어있는 함수
    • 첫 번째 매개변수는 반드시 self를 지정해야 한다.
  • 클래스 이름 : 대문자로 시작
class 클래스이름:
	def 메서드(self):
    		코드

 

- 클래서 사용 방법

  • 인스턴스 = 클래스()
  • 클래스는 특정 개념을 표현만 하기 때문에 사용하기 위해서 인스턴스(instance)를 생성해야 한다.

- 메서드 호출 방법

  • 인스턴스.메서드()
  • 메서드는 클래스가 아니라 인스턴스를 통해 호출한다.
  • 인스턴스 뒤에 .(점)을 붙이고 메서드를 호출한다.
  • 메서드 안에서 메서드 호출하기
    • self.메서드()
    • self 없이 메서드 이름만 사용하면 클래스 바깥쪽에 있는 함수를 호출한다는 뜻이다.

 

 

- 인스턴스 vs 객체

  • 객체(object) : 객체만 지칭할 때
    • 리스트 변수 a, b가 있으면 a, b는 객체
  • 인스턴스(instance) : 클래스와 연관지어서 말할 때
    • a, b는 list 클래스의 인스턴스

 

 

 

 

- 속성(attribute) 만들기

  • __init__ 메서드 안에 self.속성에 값을 할당한다.
class 클래스이름:
	def __init__(self):
    		self.속성 = 값

 

  • __init__ 메서드 : 인스턴스를 만들 때 호출되는 특별한 메서드
    • __init__(initialize) 이름 그래도 인스턴스(객체)를 초기화한다.

 

- self의 의미

  • self : 인스턴스 자기 자신을 의미한다.

 

 

- 인스턴스 만들 때 값 받기

class 클래스이름:
	def __init__(self, 매개변수1, 매개변수2):
    		self.속성1 = 매개변수1
            	self.속성2 = 매개변수2

 

 

 

출처 : 파이썬 코딩 도장

 

 

  • 클래스 안에서 속성에 접근할 때 : self.속성
  • 클래스 바깥에서 속성에 접근할 때 : 인스턴스.속성

 

 

- 클래스 위치 인수, 키워드 인수

  • 클래스로 인스턴스를 만들 때 위치 인수와 키워드 인수를 사용할 수 있다.
  • 위치 인수와 리스트 언패킹을 사용하려면 *args 사용하면 된다. 매개변수에서 값을 가져오려면 args[0]처럼 사용해야 한다.

 

출처 : 파이썬 코딩 도장

 

  • 키워드 인수와 딕셔너리 언패킹을 사용하려면 **kwargs를 사용하면 된다. 매개변수에서 값을 가져오려면 kwargs['name']처럼 사용해야 한다.

 

출처 : 파이썬 코딩 도장

 

 

- 인스턴스를 생성 후 속성 추가하기, 특정 속성만 허용하기

  • 인스턴스.속성 = 값
  • 인스턴스 생성하고 나서 속성을 계속 추가할 수 있다.
  • 특정 속성만 허용하고 다른 속성을 제한하고 싶을 때 __slots__ 사용
  • __slots__ = ['속성이름1', '속성이름2']

 

 

 

- 비공개 속성(private attribute)

  • 클래스 바깥에서는 접근할 수 없고 클래스 안에서만 사용할 수 있다.
  • __속성
  • __속성__은 비공개 속성이 아니다.
  • 비공객 속성은 클래스 안의 메서드에서만 접근 가능하다.
  • 중요한 값인데 바깥에서 함부로 바꾸면 안될 때 비공개 속성을 주로 사용한다.

 

 

 

 

 

 

 

 

 

 

 

 

 

* 파이썬에서 자료형도 클래스이다. *

 

 

class 복습 참고 사이트 : https://dojang.io/mod/page/view.php?id=2372

 

 

 

 

 

 

 

 

728x90
반응형
Comments