스택 이라는건 기본적으로 Last In First Out 을 만족하기만 한다면 그것을 스택 구조라고 한다.
백준 10828 번 문제는 이 스택을 간단하게 구현하라는 문제였다.
- push X: 정수 X를 스택에 넣는 연산이다.
- pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
- size: 스택에 들어있는 정수의 개수를 출력한다.
- empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
- top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
이것을 만족하기만 하면 됫는데 시간제한이 1초 이므로 아무래도 하나하나 함수를 만들어서 호출하면 안되겠다 싶어서 count 라는 변수를 통해서 하나의 변수로 size 이자 현재 top의 다음부분을 가리키게 만들었다.
Push 는 count 가 가리키는 곳에 X 를 넣고 count 를 1 증가시킨다.
Pop 은 count - 1 이 가리키는 곳의 값을 출력하고 count 를 1 감소시킨다. 만약 count가 0이었다면 -1 출력
Size 는 count 를 출력한다.
Empty 는 count가 0이면 1출력 count 가 0이 아니면 0을 출력한다.
Top 은 count -1 위치를 출력한다.
이러한 연산들이 stack 이라는 배열을 대상으로 진행되게 하였다. 하나의 문제가 발생하였는데...
입력 받은 것이 어떤 명령어인지 어떻게 판단할 것인가 였다.
갑자기 string 도 인식이 안되서...내가 사용한 방법은 아스키코드 였다.
p 112
o 111
t 116
e 101
m 109
s 115
i 105
이것들을 이용해 각 명령어의 첫번째와 두번째 글자를 합하면
pop = 223
push = 229
size = 220
empty = 210
top = 227
이 되므로 이를 이용하여 스위치를 돌려서 해당하는 연산을 수행하였다. 결과는 물론 통과였다.
#include <stdio.h>
int count = 0; unsigned int stack[10000]; char temp[6];
int main() { int N,a; int selecter; // 0 push 1 pop 2 top 3 size 4 empty scanf("%d", &N); for (a = 0; a < N; a++) { scanf("%s", temp); selecter = temp[0] + temp[1]; switch (selecter) { case 229 : // push scanf("%d", &stack[count++]); break; case 223 : if(count == 0) printf("-1\n"); else { printf("%d\n", stack[count - 1]); count--; } break; case 220 : printf("%d\n", count); break; case 210 : if (count == 0) printf("1\n"); else printf("0\n"); break; case 227 : if (count == 0) printf("-1\n"); else { printf("%d\n", stack[count - 1]); } break; } } return 0; } |