algorithm/problem solving

acmicpc.net 9012(스택), 2504(스택)

qkqhxla1 2016. 8. 17. 14:45

https://www.acmicpc.net/problem/9012


스택을 이용하는 기본적인 문제이다. 스택을 이용해서 열리는괄호가 나오면 스택에 넣어주고, 


아니면 스택에서 하나씩 빼서 괄호와 비교하면 된다. 물론 끝나고 나서는 스택에 아무것도 없어야 짝이 


맞는다는 소리이므로 길이 체크도 해 주자. 

# -*- encoding: cp949 -*-
bracket_dict = {'(':')'}
for i in xrange(int(raw_input())):
    stack = []
    flag = True
    for b in raw_input():
        #print stack
        if b =='(': #열리는괄호면 스택에 넣고
            stack.append(b)
        else:
            try:
                pop = stack.pop() #)같이 그냥 )가 들어왔을때를 대비한 try except문.
                if bracket_dict[pop]!=b:
                    flag = False
                    break
            except:
                flag = False
                break

    if len(stack)!=0: flag = False
    print 'YES' if flag else 'NO'

https://www.acmicpc.net/problem/2504


2504번문제는 위 문제의 확장판이라 할 수 있다. 기본 틀은 동일하되 나같은경우 닫는 괄호가 나오면 


숫자를 계산해주는 방식으로 풀었다. 

# -*- encoding: cp949 -*-
bracket_dict = {'(':')', '[':']'}
stack = []
flag = True
s = raw_input()
for i in xrange(len(s)):
    #print stack
    if s[i] in ['(', '[']: #여는 괄호면 스택에 넣음.
        stack.append(s[i])
    else:
        try: #입력이 그냥 ]나 )처럼 닫는 괄호가 나올 경우를 대비한 try except이다.
            pop = stack.pop()
        except:
            print 0
            flag = False
            break
        temp = 0
        while pop!='[' and pop!='(': #pop했는데 숫자가 나올 경우 temp에다가 계속 더해준다.
            temp += pop
            pop = stack.pop()
        if s[i]==bracket_dict[pop]: 
            if s[i]==')':
                if temp==0: 
                    stack.append(2)
                else:
                    stack.append(2*temp)
            else:
                if temp==0:
                    stack.append(3)
                else:
                    stack.append(3*temp)
        else:
            print 0
            flag = False
            break
if flag: 
    try: #[나 (같이 여는 괄호가 있을 경우를 위한 try except이다.
        print sum(stack)
    except:
        print 0