μƒˆμ†Œμ‹

μ•Œκ³ λ¦¬μ¦˜/BaekJoon

[C++] BOJ 10845번: 큐

  • -
728x90

문제

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

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

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

μž…λ ₯

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

좜λ ₯

1
2
2
0
1
2
-1
0
1
-1
0
3

 

μ½”λ“œ

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

// 10845번 큐

//큐 κ΅¬ν˜„
class QueueS {
public:
	int front;
	int back;
	int size;
	int *values;		//λͺ¨λ“  값듀을 담은 배열을 κ°€λ¦¬ν‚€λŠ” 포인터

	//μƒμ„±μž
	QueueS() {
		size = 10001;		//큐의 μ‚¬μ΄μ¦ˆ 
		values = new int[size];
		front = 0;
		back=0;
	}
	//μ†Œλ©Έμž
	~QueueS() {
		delete[] values;
	}

	void push(int data) {
		if ((back+1)%size!=front) {
			values[back] = data;
			back = (back + 1) % size;
		}
	}

	void pop() {
		front = (front + 1) % size;
	}

	bool empty() {
		if (back == front)
			return true;
		else
			return false;
	}
};

QueueS st;

void getNumSize(string str) {
	int temp;

	if (str == "back") {
		if (st.back - st.front != 0) {
			cout << st.values[st.back - 1] << "\n";
		}
		else cout << "-1\n";
	}
	else if (str == "front") {
		if (st.back - st.front != 0) {
			cout << st.values[st.front] << "\n";
		}
		else cout << "-1\n";
	}
	else if (str == "size") {
		cout << st.back-st.front << "\n";
	}
	else if (str == "empty") {
		cout << ((st.back - st.front==0)?true:false) << "\n";
	}
	else if (str == "pop") {
		if (st.back - st.front!=0) {
			cout << st.values[st.front] << "\n";
			st.pop();
		}
		else {
			cout << "-1\n";
		}
	}
	else if (str == "push")
	{
		cin >> temp;
		st.push(temp);
	}
}

int main() {

	int n;
	string str;
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> str;
		getNumSize(str);
	}

	return 0;
}

 

*κ°„λ‹¨ν•œ ν•΄μ„€*

큐λ₯Ό 클래슀λ₯Ό μ΄μš©ν•˜μ—¬ κ΅¬ν˜„ν•˜μ˜€λ‹€. 큐 클래슀의 front,back은 μΌμ’…μ˜ 맨 μ•žμ˜ index 번호λ₯Ό λ§ν•˜λŠ” 것이고, back은 맨 λ’€μ˜ index번호λ₯Ό λ§ν•˜λŠ” 것이닀. 그리고 int* valuesλ₯Ό ν†΅ν•΄μ„œ μž…λ ₯ 받은 값듀을 back을 λŠ˜λ €κ°€λ©΄μ„œ μ €μž₯ν•˜μ˜€λ‹€.

 

 

C ꡬ쑰체와 C++의 queue 라이브러리λ₯Ό μ΄μš©ν•˜μ—¬ κ΅¬ν˜„ν•˜μ‹  뢄도 μžˆμ—ˆλ‹€.

https://blockdmask.tistory.com/119

 

[λ°±μ€€ 10845] 큐 (C, C++ Queue)

μ•ˆλ…•ν•˜μ„Έμš”.BlockDMask μž…λ‹ˆλ‹€. μ˜€λŠ˜μ€ μ˜κ΅­μ— μ˜¨μ§€ 이틀째 λ˜λŠ”λ‚ μž…λ‹ˆλ‹€. μ œκ°€ μ›ν•˜λŠ” 데둜 μ €λŠ” 영ꡭ 런던 리젠트 곡원 λ²€μΉ˜μ— μ•‰μ•„μ„œ λ¬Έμ œλ₯Ό ν’€μ–΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€. ν™•μ‹€νžˆ 집쀑이 μ•ˆλ˜μ„œ; μ‰¬μš΄ 자

blockdmask.tistory.com

λ‚΄ μ½”λ“œλŠ” 헀더λ₯Ό μΆ”κ°€ν•˜μ§€ μ•ŠλŠ”λ° μ‹œκ°„μ΄ λ„ˆλ¬΄ κΈΈμ–΄μ„œ.. λΈ”λ‘œκ·Έ 글을 μ°Έκ³ ν•˜λ‹€ λ³΄λ‹ˆ μ•„λ¬΄λž˜λ„ coutλ¬Έμ œλ„ μžˆμ„ 것 κ°™μ•„μ„œ printf둜 ν•œλ²ˆ λ‹€ λ°”κΏ”λ³΄μ•˜λ‹€.

 

κ·Έλ ‡κ²ŒκΉŒμ§€ 영ν–₯을 쀀건 μ•„λ‹Œκ°€λ³΄λ‹€ μ‹Άμ–΄μ„œ μ’€ 더 μ°Ύμ•„λ³΄λ‹ˆ

https://coding-insider.tistory.com/entry/cin-cout-%EC%9E%85%EC%B6%9C%EB%A0%A5-%EC%86%8D%EB%8F%84-%EB%B9%A0%EB%A5%B4%EA%B2%8C%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95

 

cin, cout μž…μΆœλ ₯ 속도 λΉ λ₯΄κ²Œ ν•˜λŠ” 방법

scanf와 cin은 λ‹€μŒκ³Ό 같이 μ†λ„λ©΄μ—μ„œ 큰 차이가 λ‚œλ‹€. λ”°λΌμ„œ 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•  수 μžˆλŠ” 방법이 μžˆλ‹€. 1 2 3 ios_base :: sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cs + endl 보닀..

coding-insider.tistory.com

cin의 속도가 생각보닀 μ—„μ²­ λŠλ¦¬λ‹€λŠ”κ²ƒ! 

ios_base :: sync_with_stdio(false); 
cin.tie(NULL); 
cout.tie(NULL);

이 μ½”λ“œλ₯Ό μΆ”κ°€ν•΄μ£Όλ©΄ λΉ¨λΌμ§„λ‹€κ³ λŠ” ν•˜λ‚˜ scanf,printf와 같이 μ‚¬μš©ν•˜λ©΄ μ•ˆλ˜κ³  μ‹±κΈ€μ“°λ ˆλ“œ μ˜μ—­μ—μ„œλ§Œ μ‚¬μš© κ°€λŠ₯ν•΄μ„œ μ‹€μ œ μ½”λ“œ μ˜μ—­μ—μ„œλŠ” μ‚¬μš©ν•˜λŠ” 것을 μ§€μ–‘ν•˜λΌκ³  ν•œλ‹€.

일단 μ‹±κΈ€ μ“°λ ˆλ“œ μ˜μ—­μ΄λ‹ˆ μŸ€λ“€μ„ μΆ”κ°€ν•΄μ„œ ν•œλ²ˆ λŒλ €λ³΄μ•˜λ‹€.

 

μ†λ„λŠ” λΉ¨λΌμ‘Œμ§€λ§Œ λ©”λͺ¨λ¦¬λŠ” λŠ˜μ–΄λ‚¬λ‹€.. 그러면 scanf,printf둜 λ‹€ 바꿔보겠닀.

 

κ²°κ³Όμ μœΌλ‘œλŠ” λ©”λͺ¨λ¦¬λ„ μ€„μ–΄λ“€μ—ˆλ‹€. μ•„λ¬΄λž˜λ„ scanf,printf둜 좜λ ₯ν•˜λŠ” λ°©μ‹μœΌλ‘œ μ•žμœΌλ‘œλ„ 써야겠닀.

 

μ½”λ“œ(scanf,printf)

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

// 10845번 큐
//큐 κ΅¬ν˜„
class QueueS {
public:
	int front;
	int back;
	int size;
	int *values;		//λͺ¨λ“  값듀을 담은 배열을 κ°€λ¦¬ν‚€λŠ” 포인터

	//μƒμ„±μž
	QueueS() {
		size = 10001;		//큐의 μ‚¬μ΄μ¦ˆ 
		values = new int[size];
		front = 0;
		back = 0;
	}
	//μ†Œλ©Έμž
	~QueueS() {
		delete[] values;
	}

	void push(int data) {
		if ((back + 1) % size != front) {
			values[back] = data;
			back = (back + 1) % size;
		}
	}

	void pop() {
		front = (front + 1) % size;
	}

	bool empty() {
		if (back == front)
			return true;
		else
			return false;
	}
};

QueueS st;

void getNumSize(char str[]) {
	int temp;

	if (!strcmp(str, "back")) {
		if (st.back - st.front != 0) {
			printf("%d\n", st.values[st.back - 1]);
		}
		else printf("-1\n");
	}
	else if (!strcmp(str,"front")) {
		if (st.back - st.front != 0) {
			printf("%d\n", st.values[st.front]);
		}
		else printf("-1\n");
	}
	else if (!strcmp(str ,"size")) {
		printf("%d\n", st.back - st.front);
	}
	else if (!strcmp(str,"empty")) {
		printf("%d\n", ((st.back - st.front == 0) ? true : false));
	}
	else if (!strcmp(str, "pop")) {
		if (st.back - st.front != 0) {
			printf("%d\n", st.values[st.front]);
			st.pop();
		}
		else {
			printf("-1\n");
		}
	}
	else if (!strcmp(str,"push"))
	{
		scanf("%d", &temp);
		st.push(temp);
	}
}

int main() {

	int n;
	char str[6];
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		scanf("%s", str);
		getNumSize(str);
	}

	return 0;
}

 

*이 λ°©λ²•λ§Œμ΄ λ§žλŠ” 정닡은 μ•„λ‹™λ‹ˆλ‹€.

훨씬 μ’‹κ³  λΉ λ₯Έ λ‹€λ₯Έ μ•Œκ³ λ¦¬μ¦˜μ„ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ•Œκ³ λ¦¬μ¦˜ κ³΅λΆ€ν•˜μ‹œλŠ” λΆ„λ“€ ν™”μ΄νŒ…! '0'/*

λ°˜μ‘ν˜•
Contents

ν¬μŠ€νŒ… μ£Όμ†Œλ₯Ό λ³΅μ‚¬ν–ˆμŠ΅λ‹ˆλ‹€

이 글이 도움이 λ˜μ—ˆλ‹€λ©΄ 곡감 λΆ€νƒλ“œλ¦½λ‹ˆλ‹€.