https://www.acmicpc.net/problem/2504
2504번: 괄호의 값
4개의 기호 ‘(’, ‘)’, ‘[’, ‘]’를 이용해서 만들어지는 괄호열 중에서 올바른 괄호열이란 다음과 같이 정의된다. 한 쌍의 괄호로만 이루어진 ‘()’와 ‘[]’는 올바른 괄호열이다. 만일
www.acmicpc.net
풀이 과정
(, ), [, ]로 이루어진 문자열을 보고, 올바른 괄호 문자열인지 판단하고, 맞으면 문제의 조건에 맞게 괄호의 값을 출력하는 문제이다.
올바른 괄호 문자열 판단 자체는 )가 들어오면 스택탑이 (, ]가 들어오면 스택탑이 [인지 판단만 해주면 되는데 괄호의 값을 계산하기가 조금 까다롭다.
(,나 [가 나오면 정답에 더해질 변수를 (초기값 1)을 문제의 조건에 맞게 2나 3을 곱해주고, )나 ]가 나오면 스택이 아닌 문자열에서 바로 앞에 있는 문자가 뭐였는지에 따라 변수를 정답에 더하고 변수를 나눌지, 아니면 그냥 변수를 나눌지 판단해주어야 한다.
예제로 주어진 문자열에서 정답에 더해질 변수 mul과 정답 변수 ans의 변화는 위의 그림과 같은데, 밑의 문제를 풀기 위한 아이디어와 동일한 아이디어를 사용해 괄호의 값을 구하게 된다.
https://www.acmicpc.net/problem/10799
10799번: 쇠막대기
여러 개의 쇠막대기를 레이저로 절단하려고 한다. 효율적인 작업을 위해서 쇠막대기를 아래에서 위로 겹쳐 놓고, 레이저를 위에서 수직으로 발사하여 쇠막대기들을 자른다. 쇠막대기와 레이저
www.acmicpc.net
올바른 괄호 문자열 판단의 아이디어, 쇠막대기 문제의 아이디어를 모두 활용해야 하는 문제였다.
소스 코드
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
stack<char> st;
string s;
cin >> s;
int ans = 0;
int mul = 1;
for (int i = 0; i <= s.length(); i++) {
if (s[i] == '(') {
mul *= 2;
st.push('(');
} else if (s[i] == '[') {
mul *= 3;
st.push('[');
} else if (s[i] == ']') {
if (st.empty() || st.top() != '[') {
cout << 0;
return 0;
}
if (s[i-1] == '[') ans += mul;
st.pop();
mul /= 3;
} else if (s[i] == ')') {
if (st.empty() || st.top() != '(') {
cout << 0;
return 0;
}
if (s[i-1] == '(') ans += mul;
st.pop();
mul /= 2;
}
}
if (st.empty()) cout << ans;
else cout << 0;
return 0;
}
'알고리즘 문제 풀이 > 백준' 카테고리의 다른 글
백준 4179 - 불 [C++] (0) | 2022.08.01 |
---|---|
백준 7576 - 토마토 [C++] (0) | 2022.08.01 |
백준 5430 - AC [C++] (0) | 2022.07.31 |
백준 1021 - 회전하는 큐 [C++] (0) | 2022.07.30 |
백준 2493 - 탑 [C++] (0) | 2022.07.30 |