문제 링크
https://www.acmicpc.net/problem/2841
알고리즘
1. 배열 스택 생성하여서 그줄에 맞게 플랫을 push
1)줄에 맞는 스택의 top이 프랫보다 클 경우 작거나 같아질때까지 pop 하면서 cnt++
2)스택의 top이 입력한 프랫과 같다면 continue
3)스택의 top이 입력한 프랫보다 작다면 push 하고 cnt++;
2. 스택의 top 이 프랫과 같다 continue
3. 스택의 top이 프랫보다 낮다 프랫을 push 후 cnt++;
문제 이해를 잘 못해서 꽤 오래걸렸네요 예제가 좀더 있었음 좋았을듯,
코드
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 54 55 56 57 58 59 60 61 | #include<iostream> #include<stack> using namespace std; int main() { int cnt = 0; int N; int flat; cin >> N >> flat; //스택 배열 stack<int> s[100]; for (int i = 0; i < N; i++) { int a, b; //줄번호 프렛 cin >> a >> b; if (b > flat)continue; //그 줄을 눌러야 하므로 손가락 움직임 ++ if (s[a].empty()) { s[a].push(b); cnt++; } //줄을 누르고있는 손가락이 있다면 , //눌러야 하는줄이 소리가 나고있다면 else if (s[a].top() == b)continue; //눌러야 하는 줄이 누르면 바로 소리가날경우 else if (s[a].top() < b) { s[a].push(b); cnt++; } //현재 플렛 소리가 날 때 까지 손가락을 떼야 하므로 움직임 ++ else if (s[a].top() > b) { while (s[a].top() > b) { s[a].pop(); cnt++; if (s[a].empty())break; } //비었으면 if (s[a].empty()) { cnt++; s[a].push(b); } if (s[a].top() != b) { cnt++; s[a].push(b); } } } cout << cnt; } | cs |
'c++ > 백준' 카테고리의 다른 글
백준 1904번: 01타일 (0) | 2020.03.25 |
---|---|
백준 14500번 : 테트로미노 (0) | 2020.03.25 |
백준 5397 키로거 (0) | 2019.11.21 |
백준 2493번 : 탑 (0) | 2019.11.20 |
백준 10799번 쇠막대기 (0) | 2019.11.20 |