프로그래밍/Baekjoon & Codeup
[백준] 10773번 제로(c++) 문제풀이
Homo_Viator
2023. 5. 3. 21:45
https://www.acmicpc.net/problem/10773
10773번: 제로
첫 번째 줄에 정수 K가 주어진다. (1 ≤ K ≤ 100,000) 이후 K개의 줄에 정수가 1개씩 주어진다. 정수는 0에서 1,000,000 사이의 값을 가지며, 정수가 "0" 일 경우에는 가장 최근에 쓴 수를 지우고, 아닐 경
www.acmicpc.net
<아이디어>
0을 부를 때마다 가장 최근에 재민이가 쓴 수를 지운다는 것은 스택에서 삭제 연산에 해당하는 말이다.
이 말을 통해 자료구조인 스택을 문제에 적용해야 한다는 것을 파악할 수 있다.
만약 0을 말하지 않았다면 수를 받아 적어야 하므로 스택에 삽입 연산을 실행해야 한다.
스택에 저장되어 있는 원소들의 합을 구해야 하므로 스택의 사이즈(원소의 개수)만큼 반복문을 실행시켜야 한다.
스택의 가장 위 원소를 sum에 더하고 가장 위 원소를 삭제하는 과정을 반복하면 sum에 스택의 모든 원소의 합이 들어간다.
<소스코드>
#include <iostream>
#include <stack>
using namespace std;
stack<int>st;
int K,N;
int main()
{
scanf("%d",&K);
for(int i=0;i<K;i++)
{
scanf("%d",&N);
if(N==0)//만약 0을 말했다면
{
st.pop();//가장 최근에 말했던 것을 지운다.
}
else//0이 아니라면
{
st.push(N);//스택에 N을 삽입한다.
}
}
int sum=0,siz=st.size();
//siz를 선언하지 않고 st.size()를 그대로 for문에 사용하면 안 됨.
//반복문이 돌아가며 size가 줄어들기 때문에 상수가 아니라 변수가 되버림.
for(int i=0;i<siz;i++)
{
sum+=st.top();//스택의 가장 위 원소를 sum에 더한다.
st.pop();//가장 위 원소를 삭제한다.
}
printf("%d",sum);
return 0;
}
728x90