SWLUG/λ°±μ€€ BEAKJOON

[C] λ°±μ€€ BAEKJOON 18258번: 큐 2

waterproof 2023. 11. 7. 22:12

 


[1] 문제

 

 

 

 

 

문제

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

λͺ…령은 μ΄ μ—¬μ„― κ°€μ§€μ΄λ‹€.

  • push X: μ •μˆ˜ Xλ₯Ό νμ— λ„£λŠ” μ—°μ‚°μ΄λ‹€.
  • pop: νμ—μ„œ κ°€μž₯ μ•žμ— μžˆλŠ” μ •μˆ˜λ₯Ό λΉΌκ³ , κ·Έ μˆ˜λ₯Ό μΆœλ ₯ν•œλ‹€. λ§Œμ•½ νμ— λ“€μ–΄μžˆλŠ” μ •μˆ˜κ°€ μ—†λŠ” κ²½μš°μ—λŠ” -1을 μΆœλ ₯ν•œλ‹€.
  • size: νμ— λ“€μ–΄μžˆλŠ” μ •μˆ˜μ˜ κ°œμˆ˜λ₯Ό μΆœλ ₯ν•œλ‹€.
  • empty: νκ°€ λΉ„μ–΄μžˆμœΌλ©΄ 1, μ•„λ‹ˆλ©΄ 0을 μΆœλ ₯ν•œλ‹€.
  • front: νμ˜ κ°€μž₯ μ•žμ— μžˆλŠ” μ •μˆ˜λ₯Ό μΆœλ ₯ν•œλ‹€. λ§Œμ•½ νμ— λ“€μ–΄μžˆλŠ” μ •μˆ˜κ°€ μ—†λŠ” κ²½μš°μ—λŠ” -1을 μΆœλ ₯ν•œλ‹€.
  • back: νμ˜ κ°€μž₯ λ’€μ— μžˆλŠ” μ •μˆ˜λ₯Ό μΆœλ ₯ν•œλ‹€. λ§Œμ•½ νμ— λ“€μ–΄μžˆλŠ” μ •μˆ˜κ°€ μ—†λŠ” κ²½μš°μ—λŠ” -1을 μΆœλ ₯ν•œλ‹€.

 

 

μž…λ ₯

첫째 μ€„에 μ£Όμ–΄μ§€λŠ” λͺ…λ Ήμ˜ μˆ˜ N (1 ≤ N ≤ 2,000,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] μ •λ‹΅

#include <stdio.h>
#include <string.h>

int queue[2000001];
int front = 0;
int rear = -1;

void clean(char arr[]); // μ΄ˆκΈ°ν™”μš© ν•¨μˆ˜
void push(int x);
void pop(void);
void size(void);
void empty(void);

int main(void) {
	int n, i, x;
	char command[6];
	scanf("%d", &n);
	for (i = 0; i < n; i++) {
		scanf("%s", command); // λͺ…λ Ή μž…λ ₯
		if (!strcmp(command, "push")) {
			scanf("%d", &x);
			push(x);
		}
		else if (!strcmp(command, "pop"))
			pop();
		else if (!strcmp(command, "size"))
			size();
		else if (!strcmp(command, "empty"))
			empty();
		else if (!strcmp(command, "front")) {
			if (rear - front + 1 == 0)
				printf("%d\n", -1);
			else
				printf("%d\n", queue[front]);
		}
		else if (!strcmp(command, "back")) {
			if (rear - front + 1 == 0)
				printf("%d\n", -1);
			else
				printf("%d\n", queue[rear]);
		}
		clean(command); // μ΄ˆκΈ°ν™”
	}
	return 0;
}
void clean(char arr[]) {
	int i;
	for (i = 0; i < 6; i++)
		arr[i] = '\0';
}
void push(int x) {
	queue[++rear] = x;
}
void pop(void) {
	if (rear - front + 1 == 0)
		printf("%d\n", -1);
	else
		printf("%d\n", queue[front++]);
}
void size(void) {
	printf("%d\n", rear - front + 1);
}
void empty(void) {
	if (rear - front + 1 != 0)
		printf("%d\n", 0);
	else
		printf("%d\n", 1);
}

 


[3] 해석

 

# μ½”λ“œ 뢄석

 

1) int queue[2000001];, int front = 0;, int rear = -1;:

 

- μ •μˆ˜ν˜• λ°°μ—΄ queueλ₯Ό μ„ μ–Έ, 이 νλŠ” μ΅œλŒ€ 2000001개의 μš”μ†Œλ₯Ό κ°€μ§ˆ 수 μžˆλ‹€.

- frontλŠ” 큐의 맨 μ•žμ„ κ°€λ¦¬ν‚€λŠ” 인덱슀λ₯Ό λ‚˜νƒ€λ‚Έλ‹€.

- rearλŠ” 큐의 맨 λ’€λ₯Ό κ°€λ¦¬ν‚€λŠ” 인덱슀λ₯Ό λ‚˜νƒ€λ‚Έλ‹€.

 

 

2) void clean(char arr[]);:
- clean ν•¨μˆ˜λŠ” λ°°μ—΄ arr을 μ΄ˆκΈ°ν™”ν•˜λŠ” ν•¨μˆ˜. 이 ν•¨μˆ˜λŠ” λͺ¨λ“  μš”μ†Œλ₯Ό 널 문자('\0')둜 μ΄ˆκΈ°ν™”ν•œλ‹€.

 

 

3) void push(int x);:

- push ν•¨μˆ˜λŠ” μ •μˆ˜ xλ₯Ό 큐에 μ‚½μž…ν•˜λŠ” ν•¨μˆ˜. rearλ₯Ό μ¦κ°€μ‹œν‚¨ 후에 xλ₯Ό rear μœ„μΉ˜μ— λ„£λŠ”λ‹€.

 

 

4) void pop(void);:

- pop ν•¨μˆ˜λŠ” νμ—μ„œ μš”μ†Œλ₯Ό μ œκ±°ν•˜κ³  ν•΄λ‹Ή μš”μ†Œλ₯Ό 좜λ ₯ν•˜λŠ” ν•¨μˆ˜. λ§Œμ•½ 큐가 λΉ„μ–΄μžˆμœΌλ©΄ -1을 좜λ ₯ν•œλ‹€.

 

 

5) void size(void);:

- size ν•¨μˆ˜λŠ” 큐의 ν˜„μž¬ 크기λ₯Ό 좜λ ₯ν•˜λŠ” ν•¨μˆ˜. 큐의 ν¬κΈ°λŠ” rear와 front의 차이에 1을 λ”ν•œ 값이닀.

 

 

6) void empty(void);:

- empty ν•¨μˆ˜λŠ” 큐가 λΉ„μ–΄μžˆλŠ”μ§€ μ—¬λΆ€λ₯Ό 좜λ ₯ν•˜λŠ” ν•¨μˆ˜. λ§Œμ•½ 큐가 λΉ„μ–΄μžˆμœΌλ©΄ 1을, 그렇지 μ•ŠμœΌλ©΄ 0을 좜λ ₯ν•œλ‹€.

 

 

7) int main(void):
- μ‚¬μš©μžλ‘œλΆ€ν„° λͺ…λ Ήμ–΄μ˜ 개수 n을 μž…λ ₯λ°›λŠ”λ‹€.
- λ°˜λ³΅λ¬Έμ„ 톡해 n번의 λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯λ°›κ³  μ²˜λ¦¬ν•œλ‹€.
- 각 λͺ…령어에 따라 push, pop, size, empty, front, back λ“±μ˜ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜μ—¬ μž‘μ—…μ„ μˆ˜ν–‰ν•œλ‹€.

 

 

# 문제의 포인트


큐 μžλ£Œκ΅¬μ‘° κ΅¬ν˜„:
- queue 배열을 μ‚¬μš©ν•˜μ—¬ 큐λ₯Ό κ΅¬ν˜„. front와 rearλ₯Ό μ‚¬μš©ν•˜μ—¬ 큐의 맨 μ•žκ³Ό 맨 λ’€λ₯Ό 가리킨닀.

 


[4] μ°Έκ³ 

 

https://dalconbox.tistory.com/52

 

λ°±μ€€ 18258번 큐 2 [ C ]

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

dalconbox.tistory.com