스택 (stack)은 기본적인 자료구조 중 하나로, 컴퓨터 프로그램을 작성할 때 자주 이용되는 개념이다. 스택은 자료를 넣는 (push) 입구와 자료를 뽑는 (pop) 입구가 같아 제일 먼저 들어간 자료가 제일 나중에 나오는 (FILO, first in last out) 특성을 가지고 있다.
1부터 n까지의 수를 스택에 넣었다가 뽑아 늘어놓음으로써, 하나의 수열을 만들 수 있다. 이 때, 스택에 push하는 순서는 반드시 오름차순을 지키도록 한다고 하자. 임의의 수열이 주어졌을 때 스택을 이용해 그 수열을 만들 수 있는지 없는지, 있다면 어떤 순서로 push와 pop 연산을 수행해야 하는지를 알아낼 수 있다. 이를 계산하는 프로그램을 작성하라.
이전 숫자와 현재 숫자를 비교하는 식으로 풀었다.
이전 숫자보다 현재 숫자가 더 크다면 해당 숫자까지 push, 해당 숫자가 나온다면 pop 해준다.
반대로 현재 숫자가 더 작은 숫자라면 pop 해준다.
만일 pop했는데 현재 숫자와 일치하지 않는다면 불가능한 경우이므로 NO를 출력한다.
이렇게만 했더니 NO의 경우에도 push, pop가 뜬 후 NO가 나와서 출력 초과가 나왔다.
그래서 부호들을 sign배열에 저장 후 나중에 출력하는 식으로 했다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | #include<stdio.h> void stack_push(int X); void stack_pop(); int stack[100000]; char sign[200000]; int count = 1; int main() { int N, num, prenum = 0, i = 1, signcount = 0; scanf("%d", &N); while (N--) { scanf("%d", &num); if (num > prenum) { for (;;) { if (num != i-1) { sign[signcount++] = '+'; stack_push(i); i++; } else { sign[signcount++] = '-'; prenum = num; stack_pop(); break; } } } else { stack_pop(); prenum = num; if (stack[count] == num) sign[signcount++] = '-'; else { printf("NO\n"); return 0; } } } for (int i = 0;i < signcount;i++) { printf("%c\n", sign[i]); } return 0; } void stack_push(int x) { stack[count] = x; count++; } void stack_pop() { count--; } |
'알고리즘' 카테고리의 다른 글
BOJ 2504 괄호의 값 (0) | 2018.10.04 |
---|---|
BOJ 9012 괄호 (0) | 2018.09.01 |
BOJ 10828 스택 (0) | 2018.09.01 |
BOJ 9020 골드바흐의 추측 (0) | 2018.09.01 |
BOJ 4948 베르트랑 공준 (0) | 2018.09.01 |