Patrick's Devlog

[BOJ/C++] 제로(10773번) 본문

Algorithm/Algorithms Practice

[BOJ/C++] 제로(10773번)

Patrick_ 2022. 8. 31. 15:14

1. 개요

https://www.acmicpc.net/problem/10773

 

10773번: 제로

첫 번째 줄에 정수 K가 주어진다. (1 ≤ K ≤ 100,000) 이후 K개의 줄에 정수가 1개씩 주어진다. 정수는 0에서 1,000,000 사이의 값을 가지며, 정수가 "0" 일 경우에는 가장 최근에 쓴 수를 지우고, 아닐 경

www.acmicpc.net

1-1. 문제 설명

재민이는 동아리 회식을 위해 장부를 관리하는 중이다. 재현이는 재민이를 도와 돈 관리 중인데, 재현이는 실수를 자주한다. 잘못된 수를 부를 때마다 0을 외쳐, 가장 최근에 재민이가 쓴 숫자를 지우게끔 한다. 재민이는 모든 수를 받아 적은 후 수의 합을 알고싶어 한다. 프로그램을 작성해보자.

1-2. 제한 사항

 - 첫 줄에 K가 주어지며, K는 1 이상 100,000이하 자연수

 - K개의 줄에 정수가 1개씩 주어짐

 - 정수는 0에서 1,000,000 사이 값이며, 0일 경우 가장 최근에 쓴 수를 지우고, 아닐 경우 해당 수를 씀

 - 정수가 0일 경우 지울 수 있는 수가 있음을 보장


2. 구현

2-1. 풀이

숫자를 저장할 배열을 생성하고 index를 통해 0을 입력했을 때, 가장 끝을 가리키는 index의 숫자를 없앤다.

2-2. 코드

#include <iostream>
using namespace std;

constexpr size_t MAX_NUM = 100000;
int nums[MAX_NUM];

int main() // 10773 번
{
	int count, num, result = 0, index = 0;
	cin >> count;

	for (int i = 0; i < count; i++) {
		cin >> num;
		if (num != 0) {
			nums[index++] = num;
			result += num;
		}
		else if (num == 0 && index != 0) {
			result -= nums[--index];
		}
	}
	cout << result << "\n";
	return 0;
}