코딩테스트/SWExpertAcademy

제로 C++(SW Expert Academy)

멍토 2020. 4. 11.

난이도 : D3

문제번호 : 8931

※ 저의 풀이가 무조건적인 정답은 아닙니다.

다른 코드가 좀더 효율적이고 좋을 수 있습니다.

다른사람들의 풀이는 언제나 참고만 하시기 바랍니다.

문제 주소 및 출처입니다.

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AW5jBWLq7jwDFATQ&categoryId=AW5jBWLq7jwDFATQ&categoryType=CODE

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com


목차

1. 문제 설명

2. 문제 해석

3. 소스 코드


1. 문제 설명

재현이는 재민이를 도와서 동아리 장부를 관리하고 있다.

재현이는 영수증을 모아서 동아리의 지출 금액을 세고 있고, 재민이는 재현이가 부르는 액수를 순서대로 적고 있다.

재현이는 가끔 잘못된 수를 부르는 실수를 하는데, 

이 때마다 0을 외쳐서, 가장 최근에 재민이가 쓰고 지우지 않았던 수를 지우게 시킨다.

재현이가 모든 수를 부른 후 재민이가 받아 적은 수의 합은 무엇일까?

입력

첫 번째 줄에 테스트 케이스의 수 TC가 주어진다.

각 테스트 케이스는 다음과 같이 구성되었다.

첫 번째 줄에 정수 K가 주어진다. (1  K  100,000)이후 K개의 줄에 정수가 하나씩 주어진다. 

정수는 0 이상 100000 이하의 값이다.

만약 정수가 0 경우에는 최근에 쓰고 지우지 않았던 수를 지워야 하며, 그렇지 않을 경우 해당 수를 써야 한다.

정수가 0일 경우에 지울 수 있는 수가 있음을 보장할 수 있다.

출력

각 테스트 케이스마다 ‘#x’(x는 테스트케이스 번호를 의미하며 1부터 시작한다)를 출력하고,

각 테스트 케이스마다 한 줄씩 재민이가 받아 적은 수의 합을 출력한다.

예시

입력 출력

2
6
10000
10000
0
0
100000
0
10
1
3
5
4
0
0
7
0
0
6

#1 0
#2 7

2. 문제풀이

D2급 문제이다.

스택의 개념에 대해서 알고 있다면 금방 풀 수 있다.

스택에 데이터를 넣다가 들어오는 값이 0이라면 pop을 한다.

나중에 스택에 남아있는 수를 더한 값을 출력한다.


3. 소스코드

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
#include <iostream>
#include <stack>
using namespace std;
//D3 8931 제로
 
int main() {
    int len;
    cin >> len;
    //입력받은 횟수만큼 반복
    for (int l = 1; l <= len; l++) {
        stack<int> st;
        int T, num, sum = 0;
        cin >> T;
        for (int i = 0; i < T; i++) {
            cin >> num;
            if (num)    st.push(num);
            else    st.pop();
        }
        while (!st.empty()) {
            sum += st.top();
            st.pop();
        }
        cout << "#" << l << " " << sum << endl;
    }
    return 0;
}

댓글

💲 광고입니다.