본문 바로가기
문제 해결/BaekJoon

[백준] [C++] 10773번 제로

by WSLim_97 2023. 1. 12.
반응형

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

 

10773번: 제로

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

www.acmicpc.net


코드

#include <iostream>
using namespace std;

const long long COUNT = 100000;
long long arr[COUNT] = { };

int main()
{
	long long input, k, sum = 0;
	int num = 0;
	cin >> k;

	for (int i = 0; i < k; i++)
	{
		cin >> input;
		if (input == 0 && num > 0)
		{
			arr[num] = 0;
			num--;
		}
			
		else if (input > 0)
		{
			arr[num] = input;
			num++;
		}
	}

	for (int j = 0; j < num; j++)
		sum += arr[j];
	
	cout << sum;

	return 0;
}

풀이

k개의 데이터를 장부에 입력하는데 0을 입력하는 경우 가장 최근의 쓴 수를 지우고 0이 아닐 경우 그 값을 입력한다. k개의 데이터를 입력한 후 남은 데이터의 합을 출력하는 문제이다.

 

스택의 방식이다. 스택은 후입선출(LIFO) 방식으로 값을 지울 때 가장 최근에 입력한 값을 지운다.

 

num 변수는 배열에 입력 가능한 인덱스 위치를 저장하고 0이 입력되면 인덱스의 이전 위치를 가리키도록 한다.

 

최종적으로 배열에 남은 데이터의 값들을 모두 더해 출력한다.

 

+) 예제 2 시뮬레이션

  • [1]
  • [1,3]
  • [1,3,5]
  • [1,3,5,4]
  • [1,3,5] (0을 불렀기 때문에 최근의 수를 지운다)
  • [1,3] (0을 불렀기 때문에 그다음 최근의 수를 지운다)
  • [1,3,7]
  • [1,3] (0을 불렀기 때문에 최근의 수를 지운다)
  • [1] (0을 불렀기 때문에 그다음 최근의 수를 지운다)
  • [1,6]
반응형