NIRVANA

[DAY-4] 백준 28278번 스택 2 본문

Coding test(Python3)/스터디

[DAY-4] 백준 28278번 스택 2

녜잉 2024. 5. 21. 17:34

문제 

정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.

명령은 총 다섯 가지이다.

  1. 1 X: 정수 X를 스택에 넣는다. (1 ≤ X ≤ 100,000)
  2. 2: 스택에 정수가 있다면 맨 위의 정수를 빼고 출력한다. 없다면 -1을 대신 출력한다.
  3. 3: 스택에 들어있는 정수의 개수를 출력한다.
  4. 4: 스택이 비어있으면 1, 아니면 0을 출력한다.
  5. 5: 스택에 정수가 있다면 맨 위의 정수를 출력한다. 없다면 -1을 대신 출력한다.

 

문제 풀이 접근법1

1) input() 함수를 통해 명령 프롬포트로부터 명령어를 받고, 파이썬 list를 통해 스택을 구현한다. 2

2) 만약 '1 x'가 명령어로 들어온다면, 1)에서 들어온 값 중, 1이 있는지 확인하고 x를 스택 안에 넣는다. 

이때, x는 리스트 슬라이싱을 통해 구한다. 

3) 만약 '2'가 명령어로 들어온다면, 명령어가 2인지 확인한 후, 리스트가 비어 있는지 확인한다. 만약 비어있다면 -1을 출력하고 아니라면 맨 위(리스트의 맨 마지막) 제외한 나머지 정수를 출력한다. 

4) 만약 '3'이 명령어로 들어온다면, 명령어가 3인지 확인한 후, 리스트 안 원소의 개수를 출력한다.

5) 만약 '4'가 명령어로 들어온다면, 명령어가 4인지 확인한 후, 스택이 비었는지 확인한다. 비었다면 1, 아니면 0을 출력한다.

6) 만약'5'가 명령어로 들어온다면, 명령어가 5인지 확인한 후, 리스트가 비어 있는지 확인한다. 만약 비어있다면 -1을 출력하고, 아니라면 맨 위(리스트의 맨 마지막) 정수를 출력한다. 

n = int(input())

stack = []


for i in range(n):
    order = input()
    
    if '1' in order:
        stack.append(int(order[2]))
        
    match order:
        case '2':
            if not stack:
                print(-1)
            else:
                print(stack[-1])
                del stack[-1]
                    
        case '3':
            print(len(stack))
        
        case '4':
            if not stack:
                print(1)
            else:
                print(0)
        
        case '5':
            if not stack:
                print(-1)
            else:
                print(stack[-1])
                #del stack[-1]

 

다음과 같이 시간초과 문제가 발생했다. 

찾아보니까 input()으로 받는 수가 많아서 시간 초과가 발생하게 된다고 한다. 

input()함수는 파라미터를 프롬포트에 띄우는 역할을 하여서  추가적 부하가 발생한다.

 

해당 문제를 해결하려면 sys 모듈의 stdin.readline()함수를 사용하면 된다. 

 

📌sys.stdin.readline 사용방법 

import sys
 A = sys.stdin.readline()
 
# or

input = sys.stdin.readline()
A = input()

 

 

문제 풀이 접근법2

import sys

n = int(sys.stdin.readline())

stack = []


for i in range(n):
    order = sys.stdin.readline()
    
    print(list(order))
    
    if '1' in order:
        stack.append(int(order[2]))
        
    match order:
        case '2':
            if not stack:
                print(-1)
            else:
                print(stack[-1])
                del stack[-1]
                    
        case '3':
            print(len(stack))
        
        case '4':
            if not stack:
                print(1)
            else:
                print(0)
        
        case '5':
            if not stack:
                print(-1)
            else:
                print(stack[-1])
                #del stack[-1]

 

이렇게 문제를 풀었는데 틀렸다고 나와서 엥? 

print(list(order))로 어떻게 입력 받아지는지 확인을 해봤다. 

아놔...

저 \n 때문에 틀린거였음... 

그래서 그냥 match-case문 말고 elif 사용해서 문제 풀기로 변경했다. 

 

문제 풀이 접근법3

import sys

n = int(sys.stdin.readline())

stack = []


for i in range(n):
    order = sys.stdin.readline()
    
    if '1' in order:
        stack.append(int(order[2]))
        
    if order[0] == '2':
        if not stack:
            print(-1)
        else:
            print(stack[-1])
            del stack[-1]
                    
    if order[0] == '3':
        print(len(stack))
        
    if order[0] == '4':
        if not stack:
            print(1)
        else:
            print(0)
        
    if order[0] == '5':
        if not stack:
            print(-1)
        else:
            print(stack[-1])

틀림...근데 왜그러지 고민했는데

저렇게 받으면 문제...한자리수만 받고, 두자리수 부터는 stack에 저장을 이상하게 됨...

그래서 공백을 기준으로 order를 split에서 리스트 형식으로 저장을 해야한다는 것을 알게됨

 

 

문제 풀이 접근법4(최종 답안!)

import sys

n = int(sys.stdin.readline())

stack = []


for i in range(n):
    order = sys.stdin.readline().split()
    
    if order[0] == '1':
        stack.append(order[-1])
        
    if order[0] == '2':
        if not stack:
            print(-1)
        else:
            print(stack[-1])
            del stack[-1]
                    
    if order[0] == '3':
        print(len(stack))
        
    if order[0] == '4':
        if not stack:
            print(1)
        else:
            print(0)
        
    if order[0] == '5':
        if not stack:
            print(-1)
        else:
            print(stack[-1])

아오...진짜 사소한 것 땜에 겨우 맞췄다

그래도 이래야 실수를 줄일 수 있겠지...요....^_^

 

 

💡알게된 것

1) 입력에서의 부하를 줄이기 위해서 input() 대신 sys.stdin.readline() 사용하기

2) sys.stdin.readline()은 공백을 함께 받으므로 공백을 꼭꼭 제거해서 사용하기 → 사실상 sys.stdin.readline().strip()를 그냥 하나로 생각하기...ㅎ