본문 바로가기
백준

[스택] 10773, 벡터 사용한 스택

by 송파감자 2023. 9. 8.

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

 

10773번: 제로

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

www.acmicpc.net

 

처음 도전한 코드(실패)


4,3,0,1,0은 0이 나와서 오예! 하고 돌렸는데, 바로 실패였다.

이유는 0이 연속으로 나왔을 때 오답이 나왔기 때문..

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{	
	int K {};
	int temp{};
	int sum{};

	vector<int> numbers{};

	cin >> K;
	
	for (int i{ 0 }; i < K; ++i)
	{
		cin >> temp;
		numbers.push_back(temp);
		
		//  0이면 직전 요소를 0으로 만들자
		if (i > 0 && numbers.at(i) == 0)
		{
			replace(numbers.begin(), numbers.end(), numbers.at(i-1), 0);
		}
	}

	for (int i {0}; i < K; ++i)
	{
		sum += numbers.at(i);
	}
	cout << sum;
	

	return 0;
}

 

 

그래서 계속 고민했다. 

일단, 난 벡터에 모든 수를 저장하면서 지워야 하는 수를 0으로 만들고 싶었다. 답은 Sum 을 구하는 거니까.

그런데 0이 연속으로 나왔을 땐 대체 어떻게 해야 하지 싶었다. 30분 더 고민하다가 벡터로 짠 다른 사람들의 코드를 살펴보면서 힌트를 얻고 아래와 같이 결국 수정했다.

 

정답 코드


0은 애초에 벡터에 저장하지 않았다. 그럼 0 , 0  연속으로 입력해도 벡터 안엔 0이 없기 때문에 직전 수를 pop 할 수 있었다. 흐미..  

#include <iostream>
#include <vector>

using namespace std;

int main()
{
	int K {};
	int temp{};
	int sum{};

	vector<int> v{};

	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> K;
	
	// 입력 받기
	for (int i{ 0 }; i < K; ++i)
	{
		cin >> temp;
		if (temp == 0)
			v.pop_back();
		else
			v.push_back(temp);
	}	

	// 합 구하기
	for (auto i : v)
	{
		sum += i;
	}
	cout << sum;
	

	return 0;
}

'백준' 카테고리의 다른 글

[스택, 배열] 28278 : 스택2  (1) 2023.09.13
[스택 & 벡터] 28278  (0) 2023.09.05
공백 입력..!!  (0) 2023.08.08
(2562번)최댓값 찾고 몇 번째 숫자인지 찾기  (2) 2023.04.19
[버블정렬 & 벡터] 10818번 문제  (0) 2023.04.19