*문제 출처는 백준에 있습니다.

문제 제목: 스택
문제 사이트: https://www.acmicpc.net/status?user_id=sy9216&problem_id=10828&from_mine=1
스택 성공
| 0.5 초 (추가 시간 없음) | 256 MB | 317737 | 122805 | 88715 | 39.139% |
문제
정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.
명령은 총 다섯 가지이다.
- push X: 정수 X를 스택에 넣는 연산이다.
- pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
- size: 스택에 들어있는 정수의 개수를 출력한다.
- empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
- top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
입력
첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.
출력
출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.
예제 입력 1
14
push 1
push 2
top
size
empty
pop
pop
pop
size
empty
pop
push 3
empty
top
예제 출력 1
2
2
0
2
1
-1
0
1
-1
0
3
예제 입력 2
7
pop
top
push 123
top
pop
top
pop
예제 출력 2
-1
-1
123
123
-1
-1
나의 풀이
#include <stdio.h>
#define MAX (10000 + 500)
int stk[MAX];
int strCompare(const char *a, const char *b) {
while (*a && *a == *b) a++, b++;
return *a - *b;
}
int main() {
int T;
char command[100];
int sp = 0;
scanf("%d", &T);
for (int i = 0; i < T; i++) {
scanf("%s", &command);
if (strCompare(command, "push") == 0) {
int value;
scanf("%d", &value);
stk[sp++] = value;
}
else if (strCompare(command, "pop") == 0) {
if (sp > 0) printf("%d\n", stk[--sp]);
else printf("%d\n", -1);
}
else if (strCompare(command, "size") == 0) {
printf("%d\n", sp);
}
else if (strCompare(command, "empty") == 0) {
if (sp > 0) {
printf("%d\n", 0);
}
else {
printf("%d\n", 1);
}
}
else if (strCompare(command, "top") == 0) {
if (sp > 0) printf("%d\n", stk[sp - 1]);
else printf("%d\n", -1);
}
}
return 0;
}
sp 를 활용해서 구현함
sp는 스택의 인덱스를 저장하고...
이 인덱스를 활용해서 코드 구현
포인터를 활용한 문자열 비교 코드에 관한 포스팅은 아래에
https://sillon-coding.tistory.com/706
C 문자열이 동일한지 비교 (포인터) / C++ strcmp(a, b) 에서 a == b 이면 0 을 반환함 - 아스키코드 차이
파이썬은 엄청 쉬웠는데.. 왜 C로 하필 이런 코딩을 하게됐을까..코딩 많이 될거야..스트레스 많이 받을거야.. 우선 스택 들어 가기 전에 C에서의 문자열 비교 #include int strCompare(const char *a, const cha
sillon-coding.tistory.com
+ STL 라이브러리를 활용한 풀이
#include <stdio.h>
#include <stack>
using namespace std;
int N;
stack<int> stk;
int strCompare(const char *a, const char *b)
{
while (*a && *a == *b) ++a, ++b;
return *a - *b;
}
void printStack(stack<int> stk)
{
while (!stk.empty())
{
printf("%d ", stk.top());
stk.pop();
}
putchar('\n');
}
int main()
{
stk = {};
scanf("%d", &N);
for (int i = 0; i < N; i++)
{
char command[100];
scanf("%s", command);
if (strCompare(command, "push") == 0)
{
int value;
scanf("%d", &value);
stk.push(value);
}
else if (strCompare(command, "pop") == 0)
{
if (stk.empty() == false)
{
printf("%d\n", stk.top());
stk.pop();
}
else
printf("-1\n");
}
else if (strCompare(command, "size") == 0)
printf("%d\n", stk.size());
else if (strCompare(command, "empty") == 0)
printf("%d\n", stk.empty() ? 1 : 0);
else if (strCompare(command, "top") == 0)
printf("%d\n", stk.empty() ? -1 : stk.top());
}
return 0;
}
※ 알아야 할 것
- 흑흑흑흑흑흑흐긓긓그흑흐긓그흑흑
- sp 를 활용해서 인덱스로도 구현해보자
'coding test - C++ > 백준' 카테고리의 다른 글
| 백준 / 달팽이 / C++ (0) | 2026.02.12 |
|---|---|
| 백준 / 배열 돌리기 6 - 부분 배열 반전, 회전 / C++ (0) | 2026.02.12 |
| 백준 / 배열 돌리기 3 - 상하반전, 회전, 그룹 회전 / C++ (1) | 2026.02.11 |
| 백준 / 배열 돌리기 2 / C++ (0) | 2026.02.11 |
| 백준 / 배열 돌리기 1 / C++ (0) | 2026.02.11 |