stack 16

[Java] 올바른 괄호

문제 https://school.programmers.co.kr/learn/courses/30/lessons/12909 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 풀이 과정 스택을 활용하여 풀었다. 여는 괄호(()라면 스택에 넣어준다. 닫는 괄호라면()) 스택 제일 위가 여는 괄호인지 확인한다. 여는 괄호라면 스택에서 꺼낸다. (짝이 맞으니 없애기) 닫는 괄호라면 올바른 괄호가 아니므로 false를 반환한다. 스택이 비었다면 true를 그렇지 않다면 올바른 괄호가 아니므로 false를 반환한다. 이 문제는 스택 / 큐 카테고리로 분류되어 있지만, 스택..

[Python] 9935. 문자열 폭발

words = input() # 입력받은 문자열 explode = list(input()) # 폭발 문자열 exp_l = len(explode) new_words = [] for word in words: new_words.append(word) # 기존 문자열의 단어 하나를 새 리스트에 추가 # new_words의 마지막 글자가 폭발 문자열의 마지막 글자와 같고, # 그래서 끝의 글자들이 폭발 문자열과 같다면 if new_words[-1] == explode[-1] and new_words[-exp_l:] == explode: for _ in range(exp_l): # 폭발 시키기 (문자 제거) new_words.pop() if new_words: # 문자 남아있다면 문자열로 변환하여 print pr..

Algorithm/Baekjoon 2022.01.17

[Python] 5174. subtree

후위 순회 풀이 # 후위 순회 알고리즘 / 어떤 순회를 써도 상관 X def postorder(n): global answer if n: postorder(left[n]) postorder(right[n]) answer += 1 tc = int(input()) for idx in range(1, tc+1): e, n = map(int, input().split()) # 간선의 개수 e, 시작 노드 n node = list(map(int, input().split())) # 노드 연결 정보 받아오기 left = [0 for _ in range(e+2)] # 부모를 인덱스로 자식번호 저장 right = [0 for _ in range(e+2)] for i in range(0, e*2, 2): p, c = n..

[Python] 4874. Forth

tc = int(input()) for idx in range(1, tc+1): expression = list(input().split()) stack = [] result = 'error' # 결과 저장 변수 for e in expression: # e가 숫자일 경우 stack에 push. 나중 연산 편하게 하기 위해 int로 변환 if e.isdigit(): stack.append(int(e)) # e가 숫자 아닐 경우. 그리고 stack에 뽑을 숫자 있을 경우. elif stack: # 숫자 하나 뽑는다 num1 = stack.pop() # e가 연산자일 경우 if e in '*/+-' and stack: # 숫자 하나 더 뽑아와서 e에 해당하는 연산자에 맞게 계산 후 stack에 push num..

[Python] 1224. 계산기3

# 중위 표기법 -> 후위 표기법 변환 def infix_to_postfix(expression): cal = '' # 후위 표기법 받을 문자열 stack = [] # 스택 for e in expression: # e가 숫자라면 cal에 더하기 if e not in '(*/+-)': cal += e # e가 연산자라면 else: # e가 여는 괄호라면 stack에 push if e == '(': stack.append('(') # e가 '*' 또는 '/' 라면 elif e in '*/': # 스택 top의 연산자의 우선순위가 e의 우선순위보다 작을 때까지 # stack pop 하여 가져와서 cal에 더하기 while stack and stack[-1] in '*/': cal += stack.pop() #..

[Python] 1223. 계산기2

# 중위 표기법 -> 후위 표기법 변환 def infix_to_postfix(expression): cal = '' # 후위 표기법 받을 문자열 stack = [] # 스택 for e in expression: # e가 숫자라면 cal에 더하기 if e.isdigit(): cal += e # e가 연산자라면 else: # e가 '*' 라면 if e == '*': # 스택 top의 연산자의 우선순위가 e의 우선순위보다 작을 때까지 (+가 나올때까지) # stack pop 하여 가져와서 cal에 더하기 while stack and stack[-1] == '*': cal += stack.pop() # 이제 없다면 stack에 e를 push 한다. stack.append(e) # e가 '+' 라면 elif e ..

[Python] 5432. 쇠막대기 자르기

t = int(input()) for idx in range(1, t+1): iron_bar = list(input())[::-1] # pop사용할건데 걍 편하게 생각하기 위해 뒤집어줌. temp_bar = 0 # 쇠막대기가 생기면 count total_bar = 0 # 총 쇠막대기 개수 b1 = iron_bar.pop() # 괄호 받아오기 while iron_bar: b2 = iron_bar.pop() # 괄호 받아오기 # 만약 받아온 괄호 두개가 '()'으로 레이저라면 if (b1, b2) == ('(', ')'): total_bar += temp_bar # 생성된 막대기들만큼 조각나니까 총 쇠막대기 개수에 더해주기 b1 = iron_bar.pop() # 레이저의 다음 괄호로 넘어간다. # 레이저 아..

[Python] 1859. 백만장자 프로젝트

구현 코드 # 매도 def sell(benefit, today, buy): # 산거 다 팔때까지 반복 while buy: # 오늘 포인트에서 샀던거 차이 만큼 더해주기 benefit += (today - buy.pop()) return benefit t = int(input()) for idx in range(1, t+1): n = int(input()) # pop 사용할거기 때문에 받아온 매매가들을 뒤집어 준다. deal = list(map(int, input().split()))[::-1] buy = [] # 매수한 리스트 benefit = 0 # 이익 max_point = max(deal) # 최고 주가 while deal: today = deal.pop() # 오늘 주가 # 오늘 매매가가 최고 주..