백준 10799번 쇠막대기 문제 C++ 풀이입니다.
10799번: 쇠막대기
여러 개의 쇠막대기를 레이저로 절단하려고 한다. 효율적인 작업을 위해서 쇠막대기를 아래에서 위로 겹쳐 놓고, 레이저를 위에서 수직으로 발사하여 쇠막대기들을 자른다. 쇠막대기와 레이저
www.acmicpc.net
2015 초, 중등부 정올 지역본선 문제입니다.
문제 요약
레이저로 잘린 쇠막대기의 개수를 구하는 문제인데, 입력값이 괄호로 이뤄져 있습니다.
1. 모든 레이저는 "( )" 로만 표현됩니다.
2. 나머지 괄호는 막대기의 양 끝을 표현하게 됩니다.
이때 문제에 중요한 조건이 있습니다. '쇠막대기는 자신보다 긴 쇠막대기 위에만 놓일 수 있다'
항상 안쪽에 위치하는 괄호가 더 짧은 쇠막대기에 양 끝을 표현하게 됩니다.
문제 접근
괄호 문제여서 'stack'을 이용하는 문제라는 걸 떠올렸습니다.
항상 '(' 일때는 stack에 push 해주고, ')' 일때는 레이저의 끝인지 쇠막대기의 끝인지 판단 한 뒤,
레이저의 끝이라면 왼쪽부터 쇠막대기를 잘라서 개수를 세는 방법을 생각했습니다.
정답 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
#include <bits/stdc++.h>
#define endl '\n';
#define INF 2147483647;
#define ll long long
#define pll pair<ll, ll>
#define matrix vector<vector<ll>>
#define lcm(a, b) a *b / gcd(a, b)
ll gcd(ll a, ll b) { return (b ? gcd(b, a % b) : a); }
const ll mod = 1000000007LL;
ll a, b, c, i, j, k, n, m, t;
ll test;
ll ans = 0;
ll result = 0;
bool flag;
using namespace std;
void solve() {
string s, strn;
stack<string> stk;
cin >> strn;
flag = false;
for (i = 0; i < strn.length(); i++) {
s = strn[i];
if (s == "(") {
stk.push(s);
flag = true;
} else {
if (flag) {
stk.pop();
ans += stk.size();
} else {
stk.pop();
ans += 1;
}
flag = false;
}
}
cout << ans << endl;
}
int main() {
cin.tie(0)->sync_with_stdio(0);
ll tc = 1;
// cin >> tc;
while (tc--) solve();
return 0;
}
|
cs |
25 line에서 ')' 괄호에 대해서 레이저인지 쇠막대기 끝부분인지를 판단하는 체크포인트를 생성합니다.
직전에 '(' 였다면 레이저로 판단 하는 로직입니다.(flag = true면 레이저인 상황)
이후 한 char 씩 for문을 돌면서 판단하는 코드입니다.
구현은 쉬워서 stack 떠올리고, count 하는 방법만 생각하면 그리 어렵지 않은 Stack문제였습니다.
'알고리즘' 카테고리의 다른 글
[BOJ] 백준 6198번 옥상 정원 꾸미기 - C++ 코드, 해설, 풀이 (0) | 2023.09.02 |
---|---|
[BOJ] 백준 1406번 에디터 | C++ 코드, 해설, 풀이 (2) | 2023.09.01 |
[BOJ] 백준 1956번 운동 | python 파이썬 코드, 해설, 풀이 (1) | 2023.08.24 |
[BOJ] 백준 14938번 서강그라운드 | python 파이썬 코드, 해설, 풀이 (0) | 2023.08.02 |
[BOJ] 백준 16202번 MST 게임 | python 파이썬 코드, 해설, 풀이 (0) | 2023.02.13 |