π•ƒπ•¦π•„π•šπ•£

γ€ŒβŒ¨οΈα΄„s」PS/λ°±μ€€_자료ꡬ쑰[DS]

[Baekjoon/λ°±μ€€][10845][C/C++] 큐

by λ£¨λ°€π•ƒπ•¦π•„π•šπ•£2023. 5. 3.
728x90
λ°˜μ‘ν˜•
γ€Žλͺ©μ°¨γ€
0. κ°œμš”

1. 문제
2. 풀이
3. μ½”λ“œ

0. κ°œμš”

자료ꡬ쑰, 큐 문제. 'λ°±μ€€ 18258번 큐 2' λ¬Έμ œμ™€ λ™μΌν•˜μ§€λ§Œ μž…λ ₯κ°’μ˜ μˆ˜κ°€ 훨씬 μž‘λ‹€.

1. 문제

 

18258번: 큐 2

첫째 쀄에 μ£Όμ–΄μ§€λŠ” λͺ…λ Ήμ˜ 수 N (1 ≤ N ≤ 2,000,000)이 주어진닀. λ‘˜μ§Έ 쀄뢀터 N개의 μ€„μ—λŠ” λͺ…령이 ν•˜λ‚˜μ”© 주어진닀. μ£Όμ–΄μ§€λŠ” μ •μˆ˜λŠ” 1보닀 ν¬κ±°λ‚˜ κ°™κ³ , 100,000보닀 μž‘κ±°λ‚˜ κ°™λ‹€. λ¬Έμ œμ— λ‚˜μ™€μžˆμ§€

www.acmicpc.net

[문제]

μ •μˆ˜λ₯Ό μ €μž₯ν•˜λŠ” 큐λ₯Ό κ΅¬ν˜„ν•œ λ‹€μŒ, μž…λ ₯으둜 μ£Όμ–΄μ§€λŠ” λͺ…령을 μ²˜λ¦¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

λͺ…령은 총 μ—¬μ„― 가지이닀.

  • push X: μ •μˆ˜ Xλ₯Ό 큐에 λ„£λŠ” 연산이닀.
  • pop: νμ—μ„œ κ°€μž₯ μ•žμ— μžˆλŠ” μ •μˆ˜λ₯Ό λΉΌκ³ , κ·Έ 수λ₯Ό 좜λ ₯ν•œλ‹€. λ§Œμ•½ 큐에 λ“€μ–΄μžˆλŠ” μ •μˆ˜κ°€ μ—†λŠ” κ²½μš°μ—λŠ” -1을 좜λ ₯ν•œλ‹€.
  • size: 큐에 λ“€μ–΄μžˆλŠ” μ •μˆ˜μ˜ 개수λ₯Ό 좜λ ₯ν•œλ‹€.
  • empty: 큐가 λΉ„μ–΄μžˆμœΌλ©΄ 1, μ•„λ‹ˆλ©΄ 0을 좜λ ₯ν•œλ‹€.
  • front: 큐의 κ°€μž₯ μ•žμ— μžˆλŠ” μ •μˆ˜λ₯Ό 좜λ ₯ν•œλ‹€. λ§Œμ•½ 큐에 λ“€μ–΄μžˆλŠ” μ •μˆ˜κ°€ μ—†λŠ” κ²½μš°μ—λŠ” -1을 좜λ ₯ν•œλ‹€.
  • back: νμ˜ κ°€μž₯ 뒀에 μžˆλŠ” μ •μˆ˜λ₯Ό 좜λ ₯ν•œλ‹€. λ§Œμ•½ 큐에 λ“€μ–΄μžˆλŠ” μ •μˆ˜κ°€ μ—†λŠ” κ²½μš°μ—λŠ” -1을 좜λ ₯ν•œλ‹€.

[μž…λ ₯]

첫째 쀄에 μ£Όμ–΄μ§€λŠ” λͺ…λ Ήμ˜ 수 N (1 ≤ N ≤ 10,000)이 주어진닀. λ‘˜μ§Έ 쀄뢀터 N개의 μ€„μ—λŠ” λͺ…령이 ν•˜λ‚˜μ”© 주어진닀. μ£Όμ–΄μ§€λŠ” μ •μˆ˜λŠ” 1보닀 ν¬κ±°λ‚˜ κ°™κ³ , 100,000보닀 μž‘κ±°λ‚˜ κ°™λ‹€. λ¬Έμ œμ— λ‚˜μ™€μžˆμ§€ μ•Šμ€ λͺ…령이 μ£Όμ–΄μ§€λŠ” κ²½μš°λŠ” μ—†λ‹€.

[좜λ ₯]

좜λ ₯ν•΄μ•Όν•˜λŠ” λͺ…령이 μ£Όμ–΄μ§ˆ λ•Œλ§ˆλ‹€, ν•œ 쀄에 ν•˜λ‚˜μ”© 좜λ ₯ν•œλ‹€.

[예제 μž…λ ₯ 1]

15
push 1
push 2
front
back
size
empty
pop
pop
pop
size
empty
pop
push 3
empty
front

[예제 좜λ ₯ 1]

1
2
2
0
1
2
-1
0
1
-1
0
3
λ°˜μ‘ν˜•

2. 풀이

큐 Classλ₯Ό λ§Œλ“  ν›„, 큐의 ADTλ₯Ό 직접 κ΅¬ν˜„ν•˜λŠ” λ°©μ‹μœΌλ‘œ λ§Œλ“€μ—ˆλ‹€.

STL의 Queueλ₯Ό μ΄μš©ν•΄λ„ μ’‹μ•˜κ² μ§€λ§Œ, 곡뢀 λͺ©μ μœΌλ‘œ 직접 κ΅¬ν˜„μ„ μ„ νƒν–ˆλ‹€.

3. μ½”λ“œ

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

class queue {
private:
	int* arr;

	int F;
	int R;

	const int max = 10001;
public: 
	/* Constructor & Destructor */
	queue() : F(0), R(0) {
		arr = new int[max]();
	}
	~queue() {
		delete[] arr;
	}
	/* Method */
	void push(int elem) {
		arr[++R] = elem;
	}
	int pop(void) {
		if (F == R)
			return -1;
		else
			return arr[++F];
	}
	int size(void) {
		return R - F;
	}
	int empty(void) {
		if (F == R)
			return 1;
		else
			return 0;
	}
	int front(void) {
		if (F == R)
			return -1;
		else
			return arr[F + 1];
	}
	int back(void) {
		if (F == R)
			return -1;
		else
			return arr[R];
	}
};

int main(int argc, char* argv[]) {
	/* Faster */
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);

	/* Init */
	queue q;

	/* Input */
	int N; cin >> N;
	for (int i = 0; i < N; i++) {
		string str; cin >> str;

		if (str == "push") {
			int elem; cin >> elem;
			q.push(elem);
		}
		else if (str == "pop") {
			cout << q.pop() << '\n';
		}
		else if (str == "size") {
			cout << q.size() << '\n';
		}
		else if (str == "empty") {
			cout << q.empty() << '\n';
		}
		else if (str == "front") {
			cout << q.front() << '\n';
		}
		else if (str == "back") {
			cout << q.back() << '\n';
		}
	}

	/* End */
	return 0;
}

/* μ›ν˜• 큐 이용 μ•ˆν•¨ */
/* 18258 λ¬Έμ œμ™€ 동일 (μž…λ ₯κ°’ 크기 차이) */
728x90
λ°˜μ‘ν˜•