alpyrithm_알파이리즘
[알고리즘][Python] 백준(BOJ) 10828 스택_파이썬 본문
자료구조(1)
10828 스택 https://www.acmicpc.net/problem/10828
문제 풀기 전 공부할 것 : 스택
풀이 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
'Algorithm > 백준 알고리즘_Python' 카테고리의 다른 글
[알고리즘][Python] 백준(BOJ) 1652 누울 자리를 찾아라_파이썬 (0) | 2020.08.02 |
---|---|
[알고리즘][Python] 백준(BOJ) 1004 어린 왕자_파이썬 (0) | 2020.07.29 |
[알고리즘][Python] 백준(BOJ) 11726 2xn 타일링_파이썬 (0) | 2020.03.19 |
[알고리즘][Python] 백준(BOJ) 1463 1로 만들기_파이썬 (0) | 2020.03.18 |
[알고리즘][Python] 백준(BOJ) 2438/2439/2440/2441/2442/2445/2522/2446/10991/10992 별 찍기 _ 파이썬 (0) | 2020.03.17 |