[ 문제 ] : https://www.acmicpc.net/problem/10799
10799번: 쇠막대기
여러 개의 쇠막대기를 레이저로 절단하려고 한다. 효율적인 작업을 위해서 쇠막대기를 아래에서 위로 겹쳐 놓고, 레이저를 위에서 수직으로 발사하여 쇠막대기들을 자른다. 쇠막대기와 레이저
www.acmicpc.net
[ 문제 접근 ]
괄호가 나왔으니 스택 문제라는건 쉽게 예상 가능.
( 나오면 스택에 집어 넣고
) 나오면 스택에서 빼는 전형적인 문제이겠거니 하고 접근.
문제를 읽고 한번에 이해 되지 않아서 공책에다가 시뮬레이션을 한번 해봄으로서 이해 할 수 있었다.
결론 적으로 스택 문제라기 보다는 구현 문제에 가까웠던것 같다.
( 실제로 스택을 사용하지 않고 풀었다.)
처음 풀었을때는 스택을 사용하였는데 구현하다 보니 스택이 필요 없어도 되겠다 싶어서 주석 처리 해줬다.
[ 과정 ]
스택 문제라고 인식
-> 입력을 모두 받은 뒤 스택 위에서부터 빼면서 결정할 것인가? 입력을 받으면서 결정할 것인가?
-> 빼면서 해도 괄호를 닫을때 멀리 있는 괄호를 닫은것인가 바로 앞 괄호를 닫을것인가에 대한 판단은 바로 전 입력을 참고해야하기에 그냥 입력을 받으면서 로직 처리하는게 좋다고 판단
-> 시뮬레이션 해본 결과, num 이라는 변수와 sum이라는 변수를 두어 레이저로 짤릴때마다 값을 조작해야됨을 인지.
스택의 문제의 응용 대부분은 멀리 있는 괄호와 가까이 있는 괄호를 구분할 수 있는지가 관건이다.
[ 스택 사용하지 않은 코드 ]
#include<iostream>
#include<vector>
#include<string>
#include<stack>
using std::cin; using std::cout;
using std::vector;
int main() {
std::ios::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
std::string str;
int sum = 0; // 레이저에 짤렸을때 누적 정답.
int num = 0; // 막대기 하나씩 늘어갈때마다 늘려줄 변수.
std::stack<char> st;
cin >> str;
for (int i = 0; i < str.length(); i++) {
if (str[i] == '(') {
//st.push('(');
num += 1;
}
else {
if ( str[i-1] == '(') { //!st.empty() &&
num -= 1;
sum += num;
//st.pop();
}
else {
sum += 1;
num -= 1;
}
}
}
cout << sum;
return 0;
}
[ 스택 사용한 코드 ]
using namespace std;
string s;
int ans = 0;
stack<char> st;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin >> s;
int sz = s.length();
for (int i = 0; i < sz; i++) {
if (s[i]=='(')
st.push(s[i]);
else {
if (s[i-1] == '(') { // 바로 전이 ( 로 => 레이저일 경우
st.pop(); // 앞에서 막대라고 착각하고 stack에 s[i]를 넣었으므로 pop
ans+=st.size(); // 막대의 개수만큼 ans에 추가
}
else { // 막대의 끝일 경우
st.pop(); // 막대의 개수를 1 감소
ans++; // 막대 1개가 절단된 것과 동일한 상황이므로 ans에 1 추가
}
}
}
cout << ans << "\n";
return 0;
}
[ Key Point ]
👉 막대의 개수인 num 변수를 사용해야겠다는 생각을 할 수 있어야한다.
[ 다른 사람 풀이 ]
'PS > BaekJoon' 카테고리의 다른 글
[2630] 색종이 만들기 - 재귀, 분할정복 ★★☆☆ / 복습 ○ (0) | 2021.12.02 |
---|---|
[1780] 종이의 개수 - 재귀 / 분할 정복 ★★☆☆ / 복습 ○ (0) | 2021.12.02 |
[1504] 특정한 최단 경로 - 최단경로 ★★★☆ / 복습 ○ (0) | 2021.11.28 |
[5430] AC - 구현/문자열/덱 ★★☆☆ / 복습 ○ (0) | 2021.11.26 |
[1021] 회전하는 큐 - 덱 ★☆☆☆ / 복습 ○ (0) | 2021.11.26 |