https://www.acmicpc.net/problem/10828
10828번: 스택
첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지
www.acmicpc.net
# 이전에 c++로 구현을 완료하였다.
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int main() {
stack<int> st;
int a;
cin >> a;
string str;
int temp;
while (a--) {
cin >> str;
if (str == "push") {
cin >> temp; //***
st.push(temp);
}
else if (str == "pop") {
if (st.empty()) {
printf("-1\n");
}
else {
printf("%d\n", st.top());
st.pop();
}
}
else if (str == "size") {
printf("%d\n",st.size());
}
else if (str == "empty") {
if (st.empty() == 0) {
printf("0\n");
}
else {
printf("1\n");
}
}
else if (str == "top") {
if (st.empty()) {
printf("-1\n");
}
else {
printf("%d\n",st.top());
}
}
}
}
하지만 파이썬으로 코딩을 준비하게 되면서 알고리즘 기초 문제를 다시 접하면서 만난 문제입니다.
이건 너무 쉽다고 생각해 쉽게쉽게 작성해가고 있었습니다.
📌 기본 Logic은 stack 이라는 class 를 구현하고
if-elif 문으로 각각의 case에 맞게 처리하자 였습니다.
#10828
class stack:
def __init__(self): # 스택 객체 생성
self.items = []
def push(self, item): # 스택 요소 추가 push(.append())
self.items.append(item)
def pop(self): # 스택 요소 삭제 pop()
if self.items == []:
return -1
return self.items.pop()
def top(self): # 스택 맨 앞 요소 리턴
if self.items == []:
return -1
return self.items[-1]
def isEmpty(self): # 스택이 비었는지 확인(비었으면 True 리턴)
if not self.items:
return 1
return 0
stk =stack()
num = int(input())
for i in range(num):
a = input()
if a == "top":
print(stk.top())
elif a== "pop":
print(stk.pop())
elif a=="size":
print(len(stk.items))
elif a=="empty":
print(stk.isEmpty())
else:
b = a.split(" ")
stk.push(b[1])
이런 식으로 작성하니 시간초과가 떴습니다..!!!😵💫
시간초과 날 구석이 없는데 어떻게 시간초과 가 나는지 의문이었고 그래서 구글에 " 파이썬 시간초과 " 를 검색해보았고
로직의 worst time 의 문제가 아니라면 input() 사용을 바꿔 보라는 글을 확인했습니다.
https://ruo10102.tistory.com/5?category=1007534
[Python] import sys 에 대하여
1. sys.stdin.readline()로 입력받기 입력값을 받아 저장해하는 경우 input() 으로 구현하시는 분들이 많으실텐데 sys 라는 파이썬의 표준 라이브러리를 사용하면 훨씬 빠른 시간에 적은 메모리를 사용하
ruo10102.tistory.com
이후 import sys를 통해 sys.stdin.readline() 에 대해서 공부 후
기존의 class 정의도 파이썬에 내장되어잇는 list로 구현하자고 마음 먹었습니다.
import sys
stk = []
num = int(input())
for i in range(num):
a = sys.stdin.readline().split()
if a[0] == "top":
if stk : print(stk[-1])
else: print(-1)
elif a[0]== "pop":
if stk : print(stk.pop())
else: print(-1)
elif a[0]=="size":
print(len(stk))
elif a[0]=="empty":
if stk : print(0)
else: print(1)
elif a[0]=='push':
stk.append(a[1])
첫 num 입력 즉, test case 의 숫자는 제외하고 나머지는 sys.stdin.readline으로 입력받아 공백을 기준으로 split 하여
'a'에 저장했습니다.
따라서 a[0]의 문자열이 어떤 문자열이냐에 따라 처리를 달리했습니다..^____^
후기 : 생각보다 간단할 줄 알았는데 시간 초과 를 여러번 만나 힘들었습니다ㅜ
아!! 추가적으로 주피터 노트북은 stdin.readline 구현이 잘 안되어 있어.. 오늘 파이참을 설치하려고 합니다 또르륵,,,,,
'백준' 카테고리의 다른 글
[BOJ] 9093번 단어 뒤집기 (0) | 2022.05.02 |
---|---|
[BOJ] 23080번 스키테일 암호 (0) | 2022.05.01 |