본문 바로가기
프로그래밍/Baekjoon & Codeup

[백준] 10773번 제로(c++) 문제풀이

by Homo_Viator 2023. 5. 3.

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