스택을 기본적인 성질을 이해하고 구현할 수 있다면, 쉽게 해결할 수 있는 백준 문제 3가지를 가져와 보았다.
스택에 대한 설명은 아래 글에서 자세히 적어놓았다.
https://developer-cat.tistory.com/4
[자료구조] - 스택(Stack)의 구조와 구현
1. 스택(Stack)이란? 스택(stack)이란 단어의 사전적인 뜻은, "쌓아놓은 더미"이다. 쌓아놓은 접시들을 생각하면 이해가 쉬울 것이다. 후입선출 (LIFO : Last - In - First - Out) 스택의 중요한 특징이다. 앞
developer-cat.tistory.com
10828번: 스택
https://www.acmicpc.net/problem/10828
10828번: 스택
첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지
www.acmicpc.net
- push X - 정수 X를 스택에 삽입.
- pop - 스택의 맨 위 데이터를 출력 & 삭제. 만약 스택이 비어있는 경우에는 -1을 출력.
- size - 스택에 들어있는 정수의 개수 출력.
- empty - 스택이 비어있으면 1, 아니면 0 출력.
- top - 스택의 가장 위에 있는 정수 출력. 만약 스택이 빈 경우 -1 출력.
C++ 코드
<알고리즘>
명령 횟수 N을 입력받은 후, for문을 돌면서 N번 반복한다. 명령어가 문자열로 주어지므로 string 변수를 입력받고, 입력받은 string에 따라서 각 명령을 수행한다. push를 입력받았을 경우, 정수를 한 번 더 입력받음으로써 스택에 해당 정수를 삽입한다.
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
#define MAX 1000000
int stack[MAX];
int top = -1;
//스택이 비어있는지 검사
int is_Empty(){
if (top == -1) return 1;
else return 0;
}
//스택이 가득 차있는지 검사
int is_full() {
if (top == (MAX-1)) return 1;
else return 0;
}
//스택에 데이터 삽입
void push(int k) {
if (is_full() == 1)
cout << "Overflow";
else {
top++;
stack[top] = k;
}
}
//스택의 맨 위 데이터 리턴 후 삭제
int pop() {
if (is_Empty() == 1)
return -1;
else {
int x = stack[top];
top--;
return x;
}
}
//스택의 맨 위 데이터 리턴 (삭제는 하지 않음)
int peek() {
if (is_Empty() == 1) return -1;
else return stack[top];
}
//main함수
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int N;
cin >> N;
int sum = 0;
for (int i = 0; i < N; i++) {
string s;
cin >> s;
int num;
//push가 입력될 경우 정수를 추가로 입력받기
if (s == "push") {
cin >> num;
push(num);
}
else if (s == "pop")
cout << pop() << "\n";
//배열의 인덱스는 0부터 시작하므로 top+1
else if (s == "size")
cout << top + 1 << "\n";
else if (s == "empty")
cout << is_Empty() << "\n";
else if (s == "top")
cout << peek() << "\n";
}
}
28278번: 스택2
https://www.acmicpc.net/problem/28278
28278번: 스택 2
첫째 줄에 명령의 수 N이 주어진다. (1 ≤ N ≤ 1,000,000) 둘째 줄부터 N개 줄에 명령이 하나씩 주어진다. 출력을 요구하는 명령은 하나 이상 주어진다.
www.acmicpc.net
앞선 문제와 똑같은 문제이다. 입력을 정수로 받아야 한다는 부분만 다르다.
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
#define MAX 1000000
int stack[MAX];
int top = -1;
int is_Empty(){
if (top == -1) return 1;
else return 0;
}
int is_full() {
if (top == (MAX-1)) return 1;
else return 0;
}
void push(int k) {
if (is_full() == 1)
cout << "Overflow";
else {
top++;
stack[top] = k;
}
}
int pop() {
if (is_Empty() == 1) return -1;
else {
int x = stack[top];
top--;
return x;
}
}
int peek() {
if (is_Empty() == 1) return -1;
else return stack[top];
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int N;
cin >> N;
for (int i = 0; i < N; i++) {
int num;
cin >> num;
if (num == 1) {
cin >> num;
push(num);
}
else if (num == 2)
cout << pop() << "\n";
else if (num == 3)
cout << top + 1 << "\n";
else if (num == 4)
cout << is_Empty() << "\n";
else if (num == 5)
cout << peek() << "\n";
}
}
10773번: 제로
https://www.acmicpc.net/problem/10773
10773번: 제로
첫 번째 줄에 정수 K가 주어진다. (1 ≤ K ≤ 100,000) 이후 K개의 줄에 정수가 1개씩 주어진다. 정수는 0에서 1,000,000 사이의 값을 가지며, 정수가 "0" 일 경우에는 가장 최근에 쓴 수를 지우고, 아닐 경
www.acmicpc.net
0을 입력받으면 가장 최근에 쓴 수를 지우고, 아닐 경우 입력받은 수를 쓰는 문제이다.
스택을 이용하여 0이 입력되면 pop연산을 하고, 아니면 push 연산을 하면 해결할 수 있다. 입력이 끝난 후 top 변수를 이용하여 스택에 정수가 남아있는 개수만큼 pop을 하여 스택 내 데이터의 총합을 구하면 된다.
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
#define MAX 1000000
int stack[MAX];
int top = -1;
int is_Empty(){
if (top == -1) return 1;
else return 0;
}
int is_full() {
if (top == (MAX-1)) return 1;
else return 0;
}
void push(int k) {
if (is_full() == 1)
cout << "Overflow";
else {
top++;
stack[top] = k;
}
}
int pop() {
if (is_Empty() == 1) return -1;
else {
int x = stack[top];
top--;
return x;
}
}
int peek() {
if (is_Empty() == 1) return -1;
else return stack[top];
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int K;
cin >> K;
int sum = 0;
for (int i = 0; i < K; i++) {
int num;
cin >> num;
//0이 아닌 수가 들어오면 push
if (num != 0) {
push(num);
}
//0 입력 시 최근에 쓴 수 지우기(pop)
else {
pop();
}
}
//스택에 들어있는 데이터 수만큼 pop연산을 하면서 sum에 더하기
while (top > -1) {
sum += pop();
}
cout << sum;
}