개인사
[S3] 백준 17952번 과제는 끝나지 않아! C++ 스택 본문
728x90

리뷰

https://www.acmicpc.net/problem/17952
스택을 활용해 과제의 최고점을 구하는 문제
전역 변수
- n : 이번 학기가 몇 분인지를 저장할 변수
- stack : 스택으로 사용할 pair<int, int>타입 벡터
함수
없음
문제풀이
- n값을 입력 받고, 변수 sun을 0으로 초기화한다.
- n번의 for문을 개행하고, 매 루프마다 변수 op를 초기화 하고, 값을 입력 받는다.
- 만약 op가 1이라면 변수 a, t를 초기화 하고, 값을 입력 받는다.
- 만약 t가 1이라면 sum에 a를 더해준다, 아니라면 stack에 {a, --t}를 push한다.
- op가 0이라면 stack이 비지 않았고, stack의 back의 second를 전위감소 시켜준다.
- 감소 후 stack의 back의 second가 0일 경우 sum에 stack의 back의 first를 더해주고, stack에서 마지막 요소를 pop한다.
- sum에 저장된 값을 출력한다.
트러블 슈팅
- 스택에 아무것도 존재하지 않을 때에도 stack의 back을 참고하려고 하여 WA를 받았다.
- stack의 back을 참조하기 전에 stack이 empty상태인지를 확인하는 로직을 추가하여 AC를 받았다.
참고 사항
- N이 최대 100만이고, A가 최대 100이므로 int 범위 내로 처리할 수 있다.
- 입력 값이 많으므로 빠른 입출력을 권장한다.
정답 코드
#include<iostream>
#include<vector>
using namespace std;
using pii = pair<int, int>;
int n;
vector<pii> stack;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
int sum = 0;
for (int i = 1; i <= n; ++i) {
int op; cin >> op;
if (op == 1) {
int a, t; cin >> a >> t;
if (t == 1) sum += a;
else stack.push_back({ a, --t });
}
else {
if (!stack.empty() && !--stack.back().second) {
sum += stack.back().first;
stack.pop_back();
}
}
}
cout << sum;
}728x90
'알고리즘 공부 > C++' 카테고리의 다른 글
| [G5] 백준 23843번 콘센트 C++ 정렬, 우선순위 큐, 그리디 알고리즘 (0) | 2026.02.24 |
|---|---|
| [G3] 백준 1833번 고속철도 설계하기 C++ 정렬, 유니온 파인드, MST, 최소 스패닝 트리 (0) | 2026.02.20 |
| [G5] 백준 14217번 그래프 탐색 C++ 너비 우선 탐색, unordered_set (0) | 2026.02.18 |
| [G3] 백준 16441번 아기돼지와 늑대 C++ 너비 우선 탐색, 시뮬레이션 (0) | 2026.02.15 |
| [G3] 백준 23286번 허들 넘기 C++ 플로이드 와샬 (0) | 2026.02.13 |
