이걸 풀면서 느낀게 파이썬은 정말 강력한 도구라는 것이다. 파이썬이 아니라면 이 문제 아마 1시간은 더 코딩했었어야 됐을 것이다. 1. 스택을 통해 괄호가 열고 닫히는 인덱스 쌍을 bracket에 저장한다. 2. bracket의 수만큼 combination을 수행해서 해당문자열을 만들어준다. 3. 그걸 res에 저장하고, 중복을 제거한후에 소팅해서 출력한다. from itertools import combinations s=list(input()) stack=[] bracket=[] res=[] for x in range(len(s)): if s[x]=='(': stack.append(x) elif s[x]==')': start=stack.pop() bracket.append((start,x)) for ..
스택
간단해 보였지만 생각보다 생각할 것이 많았던 문제 무한 if else문으로 해결완료 import sys input=sys.stdin.readline n,p=map(int,input().split()) stack=[[] for _ in range(p+1)] cnt=0 for _ in range(n): a,b=map(int,input().split()) if stack[a]: if stack[a][-1]>b: x=0 while stack[a] and stack[a][-1]>=b: x=stack[a].pop() cnt+=1 if x==b: cnt-=1 stack[a].append(b) else: cnt+=1 stack[a].append(b) elif stack[a][-1]==b: continue else: s..
스택의 본질에 집중하자 이전값을 저장하고, 연산 후 다시 저장하고의 반복이다. 틀린코드 s=input() cur=0 stack=[] res=0 plus=0 for x in range(len(s)): if s[x]=="(": if x!=0: mul=int(s[x-1]) stack.append((plus-1,mul)) plus=0 elif s[x]==")": p,m=stack.pop() res=(res+plus)*m+p plus=0 else: plus+=1 print(res+plus) 이전의 결과값보다는 연산해야 하는 내용을 저장하려고 했고, 결론은 스택의 본질에 맞추지 못해서 꼬여버린 코드 s=input() cur=0 stack=[] for x in range(len(s)): if s[x]=="(": if..
생각보다 어려웠던 문제 결국은 풀긴했는데 매우 찝찝하게 풀었다. l=input() stack=[] res=0 tmp=1 for x in range(len(l)): if l[x]=="(": tmp*=2 stack.append(l[x]) elif l[x]=="[": tmp*=3 stack.append(l[x]) elif l[x]==")": if stack and stack.pop()=='(': if l[x-1]=='(': res+=tmp tmp=tmp//2 else: print("0") exit() elif l[x]=="]": if stack and stack.pop()=='[': if l[x-1]=='[': res+=tmp tmp=tmp//3 else: print("0") exit() if stack: p..
마침 스택을 보고 와서인지 문제를 보자마자 스택이 떠올랐다. 1. 스택이 비었다면 입력값을 추가한다. 2. 입력값과 스택의 마지막값이 같다면, 스택에 입력값을 추가한다. 3. 또한 스택의 마지막값이 )이고, 입력값이 (일때도 추가한다. 4. 스택에 남아있는 것이 없다면 YES, 남아있다면 NO를 출력하게 한다. n=int(input()) for _ in range(n): stack=[] inp=list(input()) for x in inp: if not stack: stack.append(x) else: pop=stack.pop() if pop==x or (pop==")" and x=="("): stack.append(pop) stack.append(x) if not stack: print("YES")..