알고리즘/백준
[백준 10799] 쇠막대기 (C++)
라이언납시오
2021. 1. 13. 14:30
728x90
반응형
문제링크: www.acmicpc.net/problem/10799
10799번: 쇠막대기
여러 개의 쇠막대기를 레이저로 절단하려고 한다. 효율적인 작업을 위해서 쇠막대기를 아래에서 위로 겹쳐 놓고, 레이저를 위에서 수직으로 발사하여 쇠막대기들을 자른다. 쇠막대기와 레이저
www.acmicpc.net
1. 주의할 점
- 레이저가 쏘아질 때, 얼만큼 값이 추가되는지 확인한다
- 끝처리를 어떻게 할지 생각한다
2. 구현
- 레이저는 항상 () 형태로 입력되므로 '('다음에 ')'가 있으면 레이저, 없으면 쇠막대기의 연장선이라고 생각한다
- 쇠막대기면 Stack에 '('를 추가한다
- 레이저라면 Stack의 크기만큼 Result에 더한다(레이저를 기준으로 왼쪽 부분 추가)
- 쇠막대기가 끝났다면, Result++와 Stack에서 pop()을 수행한다
- 마지막이 쇠막대기로 끝났다면, 위의 연산에서 추가가 되지 않으므로(오른쪽 연산은 수행하지 않았으므로) Result에 Stack의 크기만큼 더한다
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
string str;
cin >> str;
stack<char> s;
int result = 0;
for (int i = 0; i < str.size(); i++) {
char c = str[i];
if (c == '(') {
if (str[i + 1] == ')') {
result += s.size();
i++;
}
else
s.push(c);
}
else {
result++;
s.pop();
}
}
result += s.size();
cout << result;
return 0;
}
728x90
반응형