백준_10799 (쇠막대기_스택)

RostoryT·2022년 6월 21일
0

Stack Queue

목록 보기
9/17


풀기 전 메모 --> 이거 보지마

  • () 쌍을 스택에 넣으면서 진행하면 될거같은데

  • 막대기 같은 경우는 (가 시작점이고, )가 나오면 막대기 끝인데

    • ()가 연달아서 나오는 경우엔 막대기가 아닌 레이저임
  • 레이저가 잘리는게 아니라, 쇠막대기가 잘리는거!!!

  1. 괄호가 열릴 때마다 = '('등장할 때마다 스택에 append()
  2. 넣으면서 ()가 나오면 다른 tmp에 막대기 수++ 해준다
  3. 괄호가 닫힐 때마다 = ')' 등장할 때마다 스택에서 pop()
    • answer = 레이저수 + 1 해준다

프로세스 --> 여길 봐

  • 차근차근 하나씩 해보면서 추가할거 추가하고 코드로 짜니까 한번에 풀었음
(  stack.append() & += 1
 ( stack.append() & += 1
  ( stack.append() & += 1
   ( stack.append() & += 1
    ) if [i-1] == '(' :   pop() & -= 1 &  += len(stack) x2
     ( stack.append() & += 1
      ) if [i-1] == '(' :   pop() & -= 1 &  += len(stack) x2   여기까진 계산상 맞음
       ) if [i-1] == ')' : pop()                               이러면 되지않나?
        ( stack.append() & += 1
         ( stack.append() & += 1
          ) if [i-1] == '(' :   pop() & -= 1 &  += len(stack) x2
           ) if [i-1] == ')' : pop()                            이러면 되지않나?
            ( stack.append() & += 1
             ) if [i-1] == '(' :   pop() & -= 1 &  += len(stack) x2

정답 코드

  • 즉, 스택 안에 있는 것 = 잘려 있는 막대기 수
    - 그래서 레이저로 잘리면, 잘려져있는 만큼 + 해주고
    • 레이저가 아닌데 닫혀있으면, 막대기 하나 끝난거 = pop()
  • 다른 사람들 솔루션 코드도 나랑 똑같음
''' 내가 푼 '''
import sys
arr = sys.stdin.readline()
stack = []
ans = 0
leng = len(arr)

for i in range(leng):           # ')'부터 들어올일은 없음
    if arr[i] == '(':
        stack.append('(')       # 스택 길이 늘린다 = 잘려있는 막대기
        ans += 1                # 막대기 수 추가
        
    elif arr[i] == ')':
        # this is laser
        if arr[i-1] == '(':
            stack.pop()
            ans -= 1            # 막대기 수 추가 취소
            ans += len(stack)   # 막대기 수 스택 길이만큼 추가(= 2배)
        # this is not laser
        else:
            stack.pop()          # 스택의 길이만 줄여주자!
            
print(ans)



profile
Do My Best

0개의 댓글