Algorithms

[BOJ] 스택문제 - 9012 괄호, 10828 스택, 10773 제로 Python3

devran 2023. 1. 27. 18:04
반응형

🔑 백준 괄호 9012

생각 정리

한 쌍의 괄호 ( , ) → ( 아무거나 ) = VPS 라고 부름

괄호가 열리고 닫혀야 YES!!

‘ ) ‘ 이걸로 문자열이 시작되면 안됨

‘ ( ’ 이걸로 문자열이 시작되는 경우의 수를 생각해보자,,

  • ‘ ( ’ 이걸로 끝나면 어차피 안됨
  • ‘ ) ’ 이걸로 끝나는 경우의 수 = 시작괄호 ’ ( ’ 끝괄호가 ‘ ) ’ 인 경우
    • ‘ ( ’ 와 ‘ ) ’의 숫자가 동일해야 함
    • ‘ ( ’ 일때 +1 , ‘ ) ’ 일때 -1 이라고 가정하자
      • ((()) 일 경우, +1 → X
      • (((()()()))) 일 경우, 0 → O
      • ()) 일 경우, -1 → X
      • 즉, 무조건 0이 나와야만 문제가 해결됨으로 카운트로 풀어낼 수 있을 듯하다. → 코드 1

스택 문제이기 때문에, ‘ ( ’일 경우 스택에 push 해주고 ‘ ) ’이 나올 경우 pop을 해주어서 마지막에 남는게 없도록 하면 더 쉽게 풀 수 있다. → 코드 2

코드 1

# 스택 사용하지 않고 풀이
import sys

t = int(input())

for _ in range(t):
    input= sys.stdin.readline().rstrip()
    sum = 0
    
    for i in input:
        if i == ('('):
            sum += 1
        elif i == (')'):
            sum -= 1
        if sum < 0 :
            print('NO')
            break
    if sum > 0:
        print('NO')
    elif sum == 0:
        print('YES')

코드 2

# 스택 사용해서 풀이
import sys
t = int(input())

for i in range(t):
    input = sys.stdin.readline().rstrip()
    stack = []
    cnt = 0
    
    for i in input:
        if i == ('('):
            stack.append(i)
        elif i == (')'):
            if stack: #스택이 있는경우
                stack.pop()
            else: #스택이 없는경우
                print("NO")
                break
    else: 
        if not stack:
            print("YES")
        else:
            print("NO")

🔑 백준 스택 10828

명령이라니!! 거만한 문제네, 명령!

어따 명령인것이니

생각정리

push: python 에서 stack이라는 빈 리스트를 선언한 후, append 사용

pop: list의 pop 사용

size: 리스트의 length 구하기

empty: 비어있으면 1, 아니면 0 출력 length로 구하면 될듯

top: list의 가장 뒤쪽 출력, 없으면 -1 출력

→ 대충 리스트 내장 기능들로 해결이 가능한것으로 보임

코드

import sys
def push(x):
    stack.append(x)
def pop():
    if not stack:
        return -1
    else:
        return stack.pop()  
def size():
    return len(stack)
def empty():
    if len(stack) == 0 :
        return 1
    else:
        return 0
def top():
    if not stack:
        return -1
    else:
        return stack[-1]

# 첫째 줄에 주어지는 N
N = int(sys.stdin.readline().rstrip()) #rstrip=공백제거
stack = []

# N개에 줄에 주어지는 명령들
for _ in range(N):
    input_split = sys.stdin.readline().rstrip().split()
    order = input_split[0]
    if order == "push":
        push(input_split[1])
    elif order == "pop":
        print(pop())
    elif order == "size":
        print(size())
    elif order == "empty":
        print(empty())
    elif order == "top":
        print(top())

🔑 백준 제로 10773

웬일로 힌트도 주는 문제네 ,, 발전했구나 백준아

확실히 프로그래머스보다 기초부터 하기 좋지만, 정말,,,,, ㅜ 틀이 주어지는 게 좋단말이지~

문제 짜증난다 수학문제도 아니고 재현이가 사고를 많이 치네;;

생각정리

재현이가 숫자 잘못 부를 때 0을 외침 → 가장 최근에 쓴 수를 지움 pop()

재민이가 모든 수를 받아 적은 후 그 수의 합을 알고 싶어 함

0이 아닌 숫자를 입력하면 자동으로 stack.append(숫자)

0을 입력할 시에는 stack.pop()

합은 sum을 이용하여 구하면 될듯하다!

코드

import sys
k = int(input())
stack = []

for i in range(k):
    input = sys.stdin.readline().rstrip()
    n = int(input)
    
    if n == 0:
        stack.pop()
       
    else:
        stack.append(n)
    
print(sum(stack))

진짜 간단하구나?!,,

반응형