본문 바로가기
백준

[스택 & 벡터] 28278

by 송파감자 2023. 9. 5.

실버 문제 처음 풀어보았다. 

친구들과 알고리즘 스터디를 하는데, 골드 문제 푼 친구의 코드 설명을 듣고 실버 정도는 도전해도 좋겠단 생각이 들었다.

벡터를 열심히 연습하고자 스택 문제에 벡터를 써서 접근했다.

 

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

 

28278번: 스택 2

첫째 줄에 명령의 수 N이 주어진다. (1 ≤ N ≤ 1,000,000) 둘째 줄부터 N개 줄에 명령이 하나씩 주어진다. 출력을 요구하는 명령은 하나 이상 주어진다.

www.acmicpc.net

 

우선.. 스택은 접시 쌓기 처럼 맨 처음에 넣은 요소가 맨 밑바닥이 된다는 것을 기억해야 했다.

시간 초과한 나의 코드


#include <iostream>
#include <vector>

using namespace std;

vector <int> stack{};

//--------------------------------------------------------
void Pop2()
{
	if (stack.size() == 0)
		cout << -1 << endl;		

	// 정수가 있다면 맨 위 정수 빼고 출력	
	else
	{
		cout << stack.back() << endl;
		stack.pop_back();
	}				
}
void CheckSize3()
{
	cout << stack.size() << endl;
}
void CheckEmpty4()
{
	if (stack.size() == 0)
		cout << 1 << endl;
	else
		cout << 0 << endl;
}
void CheckNum5()
{
	// 정수가 있다면 맨 위 정수 출력
	if (stack.size() != 0) 		
		cout << stack.back() << endl;

	else
		cout << -1 << endl;
}
//---------------------------------------------------
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);

	int N; // 명령의 수
	cin >> N;	
	
	int orderNum {};
	int cnt{};
	int temp{};

	while (cnt < N)
	{
		cin >> orderNum;
		++cnt;
		switch (orderNum)
		{
		case 1:			
			cin >> temp;
			stack.push_back(temp);
			break;		
			
		case 2:
			Pop2();
			break;

		case 3:
			CheckSize3();
			break;

		case 4:
			CheckEmpty4();
			break;

		case 5:
			CheckNum5();
			break;

		default:
			break;
		}
	};
		
	

	return 0;
}

 

띠발.... 2시간동안 시간 초과 때문에 고민하다가 질문게시판을 보니까 endl이 느리니까 \n을 쓰라는 조언을 보고는 바로 아래와 같이 고치고 통과했다.

새로 고친 통과 코드


#include <iostream>
#include <vector>

std::vector <int> stack{};

//--------------------------------------------------------
void Pop2()
{
	if (stack.size() == 0)
		std::cout << -1 << "\n";

	// 정수가 있다면 맨 위 정수 빼고 출력	
	else
	{
		std::cout << stack.back() << "\n";
		stack.pop_back();
	}				
}
void CheckSize3()
{
	std::cout << stack.size() << "\n";
}
void CheckEmpty4()
{
	if (stack.size() == 0)
		std::cout << 1 << "\n";
	else
		std::cout << 0 << "\n";
}
void CheckNum5()
{
	// 정수가 있다면 맨 위 정수 출력
	if (stack.size() != 0) 		
		std::cout << stack.back() << "\n";

	else
		std::cout << -1 << "\n";
}
//---------------------------------------------------
int main()
{
	std::ios::sync_with_stdio(0);
	std::cin.tie(0);

	int N; // 명령의 수
	std::cin >> N;
	
	int orderNum {};
	int cnt{};
	int temp{};

	while (cnt < N)
	{
		std::cin >> orderNum;
		++cnt;
		switch (orderNum)
		{
		case 1:			
			std::cin >> temp;
			stack.push_back(temp);
			break;		
			
		case 2:
			Pop2();
			break;

		case 3:
			CheckSize3();
			break;

		case 4:
			CheckEmpty4();
			break;

		case 5:
			CheckNum5();
			break;

		default:
			break;
		}
	};
		
	

	return 0;
}

 

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

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