본문 바로가기

개발공부/코테

[백준 17608: 막대기] 파이썬 풀이 _ 스택(stack)

문제

아래 그림처럼 높이만 다르고 (같은 높이의 막대기가 있을 수 있음) 모양이 같은 막대기를 일렬로 세운 후, 왼쪽부터 차례로 번호를 붙인다. 각 막대기의 높이는 그림에서 보인 것처럼 순서대로 6, 9, 7, 6, 4, 6 이다. 일렬로 세워진 막대기를 오른쪽에서 보면 보이는 막대기가 있고 보이지 않는 막대기가 있다. 즉, 지금 보이는 막대기보다 뒤에 있고 높이가 높은 것이 보이게 된다. 예를 들어, 그림과 같은 경우엔 3개(6번, 3번, 2번)의 막대기가 보인다.

 

N개의 막대기에 대한 높이 정보가 주어질 때, 오른쪽에서 보아서 몇 개가 보이는지를 알아내는 프로그램을 작성하려고 한다.

입력

첫 번째 줄에는 막대기의 개수를 나타내는 정수 N (2 ≤ N ≤ 100,000)이 주어지고 이어지는 N줄 각각에는 막대기의 높이를 나타내는 정수 h(1 ≤ h ≤ 100,000)가 주어진다.

출력

오른쪽에서 N개의 막대기를 보았을 때, 보이는 막대기의 개수를 출력한다.


풀이

import sys

N = int(sys.stdin.readline())
bar_list = []  # 막대기의 높이를 저장할 리스트
cnt = 0  # 보이는 막대기의 개수를 세는 변수

for _ in range(N):  # for문을 로프의 개수(N)만큼 돌려서 입력을 받은 후
  bar_list.append(int(sys.stdin.readline()))  # 리스트에 저장

max_bar = bar_list[N - 1]

for i in reversed(range(len(bar_list))):
  if (bar_list[i] > max_bar):  # bar_list의 값이 max_bar보다 클 때 (현재 막대기가 보일 때)
    max_bar = bar_list[i]  # max_bar 값을 바꾸고 count
    cnt += 1
print(cnt + 1)  # 가장 앞의 막대기는 무조건 보이므로 +1을 해줌

 

  • bar_list에 막대기의 높이들을 저장
  • 가장 바깥 쪽 막대기를 max_bar로 설정하고, 막대기를 하나씩 확인하면서 해당 막대기가 max_bar 보다 크다면 현재 막대기가 보이는 것이므로 max_bar 값을 해당 막대기로 바꾸고 cnt를 1 증가시킴
  • cnt를 출력 (단, 가장 앞의 막대기는 무조건 보이므로 +1을 cnr값에 +1을 해줌)

 


잘못된 코드

N = int(input()) # 막대기의 개수
bar_list = [] # 막대기의 높이를 저장할 리스트
cnt = 0 # 보이는 막대기의 개수를 세는 변수

for _ in range(N): # for문을 로프의 개수(N)만큼 돌려서 입력을 받은 후 
  bar_list.append(int(input()))  # 리스트에 저장

max_bar = bar_list[N-1]

for i in reversed(range(len(bar_list))): 
  if (bar_list[i] > max_bar):  # bar_list의 값이 max_bar보다 클 때 (현재 막대기가 보일 때)
    max_bar = bar_list[i] # max_bar 값을 바꾸고 count
    cnt += 1
print(cnt+1) # 가장 앞의 막대기는 무조건 보이므로 +1을 해줌

 

답은 맞게 나오는데 시간 초과가 뜸..

 

python 시간초과 해결 방법 → sys.stdin.readline()로 입력받기

입력값을 받아 저장해하는 경우 input() 으로 구현하는 것 보다 sys 라는 파이썬의 표준 라이브러리를 사용하면 훨씬 빠른 시간에 적은 메모리를 사용하여 입력 받을 수 있다

 

import sys
변수 = sys.stdin.readline()

 


참고링크

 

[Python] 시간 초과 날때 해결방법!

안녕하세요! daily_D 입니다! 👩🏻‍💻 오늘은 Python 으로 문제풀이할 때 시간초과가 나는 경우 해결할 수 있는 몇가지 방법을 알려드릴까합니다! 1. sys.stdin.readline()로 입력받기 입력값을 받아 저

dailylifeofdeveloper.tistory.com


스택 (Stack)

  • 데이터를 일시적으로 저장하고 처리할 때 사용되는 자료구조 중 하나
  • 후입선출(LIFO, Last-In-First-Out) 원칙

 

리스트를 사용해 stack 구현하기

파이썬에서 스택을 구현하는 방법은 여러 가지가 있지만, 가장 간단한 방법 중 하나는 리스트를 사용하는 것

 

파이썬에서 스택을 사용하는 예시 코드:

 

pythonCopy code
class Stack:
    def __init__(self):
        self.items = []

    def push(self, item):
        self.items.append(item)

    def pop(self):
        if not self.is_empty():
            return self.items.pop()

    def peek(self):
        if not self.is_empty():
            return self.items[-1]

    def is_empty(self):
        return len(self.items) == 0

    def size(self):
        return len(self.items)

 

위 코드는 스택을 나타내는 Stack 클래스를 정의하고 있다. 이 클래스는 push, pop, peek, is_empty, size 메서드를 제공한다

 

 

pythonCopy code
stack = Stack()
stack.push(1)
stack.push(2)
stack.push(3)

print("Size of the stack:", stack.size())  # 출력: Size of the stack: 3
print("Top element:", stack.peek())        # 출력: Top element: 3

popped_item = stack.pop()
print("Popped item:", popped_item)         # 출력: Popped item: 3

print("Is the stack empty?", stack.is_empty())  # 출력: Is the stack empty? False

 

Stack 클래스를 사용하여 스택을 생성하고, 요소를 추가(push)하고, 제거(pop)하며, 스택이 비어있는지 확인(is_empty)하고, 크기(size)를 확인한다.


참고 링크

 

[Python] Stack 사용하기

파이썬에서의 스택 = list를 사용 파이썬은 스택 자료구조는 따로 제공하지 않는다. 다만 기본 클래스인 list를 통해 스택을 흉내 낼 수 있다. 스택은 어떤 자료구조인가요? 스택은 가장 나중에 들

ooeunz.tistory.com