Clolent

스택 이라는건 기본적으로 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;




'Programing > C++ Algorithm' 카테고리의 다른 글

이진 탐색 ( Binary Search )  (0) 2016.07.03
Map ( 맵 ) 사용법 / STL  (0) 2016.06.29
Vector 사용법 / STL  (0) 2016.06.28
탑 / 백준 2493 / 스택  (1) 2016.06.22
큐 구현 / 백준 10845 / Queue  (1) 2016.06.22
댓글 로드 중…

블로그 정보

Clolent - 커피물조절달인

최근에 게시된 글