문제
4개의 기호 ‘(’, ‘)’, ‘[’, ‘]’를 이용해서 만들어지는 괄호열 중에서 올바른 괄호열이란 다음과 같이 정의된다.
- 한 쌍의 괄호로만 이루어진 ‘()’와 ‘[]’는 올바른 괄호열이다.
- 만일 X가 올바른 괄호열이면 ‘(X)’이나 ‘[X]’도 모두 올바른 괄호열이 된다.
- X와 Y 모두 올바른 괄호열이라면 이들을 결합한 XY도 올바른 괄호열이 된다.
예를 들어 ‘(()[[]])’나 ‘(())[][]’ 는 올바른 괄호열이지만 ‘([)]’ 나 ‘(()()[]’ 은 모두 올바른 괄호열이 아니다. 우리는 어떤 올바른 괄호열 X에 대하여 그 괄호열의 값(괄호값)을 아래와 같이 정의하고 값(X)로 표시한다.
- ‘()’ 인 괄호열의 값은 2이다.
- ‘[]’ 인 괄호열의 값은 3이다.
- ‘(X)’ 의 괄호값은 2×값(X) 으로 계산된다.
- ‘[X]’ 의 괄호값은 3×값(X) 으로 계산된다.
- 올바른 괄호열 X와 Y가 결합된 XY의 괄호값은 값(XY)= 값(X)+값(Y) 로 계산된다.
예를 들어 ‘(()[[]])([])’ 의 괄호값을 구해보자. ‘()[[]]’ 의 괄호값이 2 + 3×3=11 이므로 ‘(()[[]])’의 괄호값은 2×11=22 이다. 그리고 ‘([])’의 값은 2×3=6 이므로 전체 괄호열의 값은 22 + 6 = 28 이다.
여러분이 풀어야 할 문제는 주어진 괄호열을 읽고 그 괄호값을 앞에서 정의한대로 계산하여 출력하는 것이다.
입력
첫째 줄에 괄호열을 나타내는 문자열(스트링)이 주어진다. 단 그 길이는 1 이상, 30 이하이다.
출력
첫째 줄에 그 괄호열의 값을 나타내는 정수를 출력한다. 만일 입력이 올바르지 못한 괄호열이면 반드시 0을 출력해야 한다.
예제 입력 1 복사
(()[[]])([])
예제 출력 1 복사
28
예제 입력 2 복사
[][]((])
예제 출력 2 복사
0일단 '('나 '['에 오면 스택에 다 넣을거고
')'나 ']' 오면 스택이 비어있다면 0출력하고 끝낼거고 아니라면pop할건데 pop했을 때
stack의 크기가 0이라면 누적값을 result에 더할거고, 0이 아니라면 계속 누적해서 곱하다가 크기가 0 됐을 때 result에 더하고
문장 끝나면 result출력하려는데 맞는건가?
로직 맞는건가? 틀리다면 자려고 ㅠ
해당 댓글은 삭제되었습니다.
엉 먼가 나도 틀린게 있을 것 같아서 올렸어 ㅠ 근접한 것 같긴한데 ㅠ
0이 아니라면 계속 누적해서 곱하다가 -> 이 부분이 그렇게 자세하지 않은거 같은데. 분류에 재귀 있는거 보면 난이도 좀 올라가야 할 듯
음 그니까 내가 생각했을 때 저 스택이 비어야 더하기를 쓸 연산자가 나와서 multiple 이라는 변수를 1로 선언해놓고 스택이 빌때까지는 계속 값을 곱하는거야 multiple에 그리고 마지막에 stack이 비어있다면 ans에 mutlple 값을 더해주는 것
예시에 (()[[]]) <- 요거 직접 적용해보면 될 듯
재귀해
스택이 비면 바로 ans에 더해
그ㅜ러려고 했는데 ans 시작을 1로하자니 () 나왔을 때 3이 되버리고, 0으로하자니 곱해도0이라서 ㅠ
ans는 처음에 0이지... 곱해나가는 변수를 temp라고 두면 이건 1이라고 두고
스택이 비어서 temp를 ans에 더하게 되면 다시 temp를 1로 설정해
ㅇㅋ?
그게 맞지? 지금 ans 0으로 세팅하고, multiple을 1로 둔 다음에 스택이 비기전까지는 나오는 2나 3은 다 multiple에 곱하고 for i in sen : 이라는 반복문 끝나기전에 stack 비어있으면 ans += multiple 하고 multiple 다시 1로 초기화 시켜주려고 하는데
반복문 상관없고 pop할때마다 스택이 비었는지만 확인해
맞지 pop하고나서는 () 조합이면 temp에 2 곱하고 [] 조합이면 3곱하고 마지막에 비었으면 ans += temp 해주고
ㅇㅇ 그리고 마지막에 올바른 문자열이 맞는지 확인하면됨
아 pop할때도 확인하고
pop 하기전에 비어있으면 그냥 0출력하고 break하면 되고 마지막에는 그냥 len(stack)이 0이 아니라면 0출력하고 아니면 ans 출력하면 되지 않냐 ㅇㅅㅇ
로직은 맞은건가 ㅇㅅㅇ.. 이거 풀고 자고 싶은데
아니 틀렸음. 더 말해줘봤자 의미 없는거 같고 이거랑 비슷한 쉬운문제 있던거 같은데 그거부터 풀어라
내가 글쓴이 말을 잘 이해 못하는거 같은데, (()[]) 같은 경우에는 스택 사이즈가 0이 아니라도 +를 해야되지 않나?
맞네 ㅅㅂ 문제 이해 조차도 못했구나
잘 자 ㅋㅋ
ㄳ.. 나중에 풀어야지 하
백준 2504문제 다시 스택으로 풀어봄물론 조금 다른 방법으로..그냥 뒤에서 앞으로 배열 돌리는게 오히려 연산하기 편할 것 같아서 그렇게 햇음..이유는 앞에서 뒤의 배열로 하면 ([](([[]]))) 이런식으로 중간에 섞여서 들어가면 스택 넣을 때[[]] 이거랑 [] 이거랑 같이 더해서 값보다 더 많은 값이 나타날 수 있음그래서 문자열 뒤에서 앞으로 탐색하면 어느 배열에서 중간에 [] (( 이런식으로 끊기는지 확인이 가능하니까, 반대로 생각하면, 끊기는 걸 이용하면 됨.첫번째 배열에서 )를 만나면 temp는 처음에 0이니까 2가됨. 이후 (나 [를 만날 때 까지 계속 탐색 )나 ]은 자동으로 2나 3곱해줌 )) 반복되면 8 ]] 만나면 72를 ans라는 최종 변수에 더함. 이후 [나 (
(나 [를 만날 때 까지 계속 탐색 )나 ]은 자동으로 2나 3곱해줌 )) 반복되면 8 ]] 만나면 72를 ans라는 최종 변수에 더함. 이후 [나 (를 만나면 바로 temp임시변수를 2랑 3계속 나눠줌.. 만약 1이되면 바로 temp는 0이 됨.. 그리고, []를 만날 때 )가 하나 남아서 temp의 현재 상태는 2임. 여기서 ]를 만났으니, 다시 (나 [를 만날 때 까지 반복.. temp를 2나 3 계속 곱해줌.
)) 반복되면 8 ]] 만나면 72를 ans라는 최종 변수에 더함. 이후 [나 (를 만나면 바로 temp임시변수를 2랑 3계속 나눠줌.. 만약 1이되면 바로 temp는 0이 됨.. 그리고, []를 만날 때 )가 하나 남아서 temp의 현재 상태는 2임. 여기서 ]를 만났으니, 다시 (나 [를 만날 때 까지 반복..
temp를 2나 3 계속 곱해줌.. 그리고, ans라는 최종변수에 더함. 0까지 탐색하고 이후에는 )나 ]가 없으니 바로 끝남..
물론 이거 하기 전에, 스택이 올바른지 탐색하는 지 체크하는 것도 만들어줘야되는데, 간단하게 문자열 처음 부터 뒤까지 탐색해서 (나 [를 만나면 stack에 넣고, ]나 )를 만나면 stack이 비워져있거나 stack의 top은 (인데, 문자열 부분은 ] 또는 문자열 부분은 )인데 stack의 top은 ]이면 바로 틀린 문장이니까 0으로 출력.. 일케 해서 풀었음..
게시판 올리긴 조금 그래서 그냥 말았음.. 어차피 답 보실 꺼 같은데 그냥 참고하셈..
해당 댓글은 삭제되었습니다.
걍 포기다 실버2길래 도전했는데 못풀 문제인가보다