개발자일걸요..?

18258번 큐2 본문

알고리즘코딩/Baekjoon Online Judge

18258번 큐2

Re_A 2021. 2. 24. 21:11
728x90
반응형

문제링크 : www.acmicpc.net/problem/18258

 

18258번: 큐 2

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 2,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지

www.acmicpc.net

 



버전 1. vector를 이용해 Q class를 만들어서 진행(시간 초과)

#include <iostream>
#include <vector>
#include <string>
using namespace std;

class Q {
public:
	vector<int> v;
	void push(int x) { v.push_back(x); }
	void pop() {
		if (v.size() == 0) { cout << "-1\n"; }
		else {
			cout << v.front() << "\n";
			vector<int>::iterator iter = v.begin();
			v.erase(iter);
		}
	}
	void size() {cout << v.size() << "\n";}
	void empty() {
		if (v.size() == 0) { cout << "1\n"; }
		else { cout << "0\n"; }
	}
	void front() { 
		if (v.size() == 0) { cout << "-1\n"; }
		else { cout << v[0] << "\n"; }
	}
	void back(){
		if (v.size() == 0) { cout << "-1\n"; }
		else { cout << v[v.size()-1] << "\n"; }
	}
};

int main() {
	int N = 0;
	cin >> N;
	Q q;
	while (N--) {
   	 	cin.tie(0);
		cin.sync_with_stdio(0);
		string commend = "";
		cin >> commend;
		if (commend == "push") {
			int a = 0;
			cin >> a;
			q.push(a);
		}
		else if (commend == "pop") { q.pop(); }
		else if (commend == "size") { q.size(); }
		else if (commend == "empty") { q.empty(); }
		else if (commend == "front") { q.front(); }
		else if (commend == "back") { q.back(); }
	}
	return 0;
}

 

 

버전 2. main에서 vector로 queue 구현(시간 초과)

#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main() {
	int N = 0;
	cin >> N;

	vector<int>v;
	while (N--) {
    	cin.tie(0);
		cin.sync_with_stdio(0);
		string commend = "";
		cin >> commend;
		if (commend == "push") {
			int a = 0;
			cin >> a;
			v.push_back(a);
		}
		else if (commend == "pop") {
			if (v.size() == 0) { cout << "-1\n"; }
			else {
				cout << v[0] << "\n";
				v.erase(v.begin());
			}
		}
		else if (commend == "size") { cout << v.size() << "\n"; }
		else if (commend == "empty") {cout << v.empty() << "\n";}
		else if(commend == "front"){
			if (v.size() == 0) { cout << "-1\n"; }
			else { cout << v.front() << "\n"; }
		}
		else if (commend == "back") {
			if (v.size() == 0) { cout << "-1\n"; }
			else { cout << v.back() << "\n"; }
		}
	}
	return 0;
}

 

 

 

버전 3. STL <queue>사용 (메모리 : 8412KB   시간 : 384ms)

#include <iostream>
#include <queue>
#include <string>
using namespace std;

int main() {
	cin.tie(0);
	cin.sync_with_stdio(0);
	int N = 0;
	cin >> N;
	queue<int> q;
	int a = 0;
	while (N--) {
		string commend = "";
		cin >> commend;
		if (commend == "push") {
			cin >> a;
			q.push(a);
		}
		else if (commend == "pop") {
			if (q.empty()) { cout << "-1\n"; }
			else{
				cout << q.front() << "\n";
				q.pop();
			}
		}
		else if (commend == "size") { cout << q.size() << "\n"; }
		else if (commend == "empty") { cout << q.empty() << "\n"; }
		else if (commend == "front") {
			if (q.empty()) { cout << "-1\n"; }
			else {cout << q.front() << "\n";}
		}
		else if (commend == "back") {
			if (q.empty()) { cout << "-1\n"; }
			else { cout << q.back() << "\n"; }
		}
	}
	return 0;
}

 

 

cin.tie(0); cin.sync_with_studio(0);는 입출력 시간을 덜어주는 코드이다.

+) 참고 : su-m.tistory.com/7

 

ios::sync_with_stdio(false), cin.tie(NULL) 사용법과 설명

1. ios::sync_with_stdio(false); C 표준 stream과 C++ 표준 stream의 동기화를 끊습니다. 기본적으로, 모든 표준 stream들은 동기화 되어있습니다. 그래서 우리는 C와 C++의 입출력방식을 자유롭게 혼용할 수 있..

su-m.tistory.com

 

 

버전 4. STL <deque> 사용 (메모리 : 8416KB    시간 : 412ms)

#include <iostream>
#include <deque>
#include <string>
using namespace std;

int main() {
	int N = 0;
	cin >> N;

	deque<int>dq;
	int a = 0;
	string commend = "";

	while (N--) {
		cin.tie(0);
		cin.sync_with_stdio(0);
		cin >> commend;
		if (commend == "push") {
			cin >> a;
			dq.push_back(a);
		}
		else if (commend == "pop") {
			if (dq.empty()) { cout << "-1\n"; }
			else {
				cout << dq.front() << "\n";
				dq.pop_front();
			}
		}
		else if (commend == "size") { cout << dq.size() << "\n"; }
		else if (commend == "empty") { cout << dq.empty() << "\n"; }
		else if (commend == "front") {
			if (dq.empty()) { cout << "-1\n"; }
			else { cout << dq.front() << "\n"; }
		}
		else if (commend == "back") {
			if (dq.empty()) { cout << "-1\n"; }
			else { cout << dq.back() << "\n"; }
		}
	}
	return 0;
}

+) 참고 : hyeonstorage.tistory.com/325

 

[STL] deque 정리 및 예제

[STL] deque 정리 및 예제 deque 컨테이너는 vector 컨테이너와 기능과 동작이 비슷한 컨테이너로 vector의 단점을 보완하는 몇가지 특징을 갖는다. deque도 vector 컨테이너와 같이 시퀀스 컨테이너이며 배

hyeonstorage.tistory.com

 

반응형

'알고리즘코딩 > Baekjoon Online Judge' 카테고리의 다른 글

11866 요세푸스 문제0  (0) 2021.02.25
2164번 카드2  (0) 2021.02.24
17298번 오큰수  (0) 2021.02.23
1874번 스택 수열  (0) 2021.02.22
4949번 균형잡힌 세상  (0) 2021.02.22
Comments