#1874. 스택수열


1. 문제 이해


 우선, 제목에서 보이듯이 스택을 사용하여 해결하는 문제인걸로 보입니다. test case로 입력을 '4 3 6 8 7 5 2 1'을 받았을때, 이 수열을 1부터 n까지 오름차순으로 들어오는 수로 만든 stack으로 만들 수 있다면 push, pop 과정을 나열하거나, 수열이 만들어 지지 않는 다면 NO를 출력하는 문제입니다.


2. 접근방법


 저는 1단계와 2단계로 나누어서 진행을 해보았습니다.


1단계, no 단계를 생각하지 않고, 어떻게 push(+)와 pop(-)을 출력해 나갈지에 대한 루틴 고민하기.


2단계, NO로 가는 경로 찾기.



3. 문제 해결


[1단계]


 test case : [4 3 6 8 7 5 2 1]를 이용하여 루틴을 찾아 보도록 하겠습니다.

맨 처음으로 4를 입력 받게 된다면, 우리는 1부터 4까지 push를 할 수 밖에 없습니다. 즉, 입력받는 새로운 값이 증가할때 마다 결국엔 push할 수 밖에 없다는 것 입니다.

 자, 여기서 힌트를 얻어 MAX라는 기준을 만들어 새로 입력받는 값이 MAX보다 크다면, 이전 MAX부터 다음 MAX만큼 push가 일어나는 루틴을 찾을 수 있습니다.

 반대로, MAX보다 작다면 현재 스택에 top의 위치를 확인합니다. 스택에 경우, top이 가리키는 값이 pop 될 수 밖에 없기 때문에 top이 가리키는 값이 test case 다음값과 같다면 pop을 수행해 줍니다.


[2단계]

 

 이제 NO의 경우를 찾아 보도록 하겠습니다. 이 문제의 경우에는 1단계에서 조금만 더 생각해 본다면 쉽게 solution을 찾을 수 있습니다. 

 MAX보다 작다면 현재 top의 위치를 확인하여 그 값이 test case 다음값과 같다면 pop을 수행했습니다. 이 부분을 상기 한다면, 반대로 test case 값과 같지 않을때는 NO가 나오는것을 생각해 낼 수 있습니다.


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>
#define MAX 100000
#define S_MAX 200000
 
typedef struct Stack {
    int s[S_MAX];
    int top;
}Stack;
 
Stack stack;
 
int main() {
    int num;
    int input[MAX];
    char output[S_MAX];
    int i, j;
    stack.top = -1;
    int cnt = 0;
    int output_i = 0;
    int max = 0;
 
    scanf("%d"&num);
 
    for (i = 0; i < num; i++) {
        scanf("%d"&input[i]);
        if (max < input[i]) {
            for (j = max; j < input[i]; j++) {
                max = input[i];
                
                stack.s[++stack.top] = (++cnt);
                output[output_i++= '+';
            }
            --stack.top;
            output[output_i++= '-';
        }
        else if (max > input[i]) {
            if (stack.s[stack.top] != input[i]) {
                printf("NO");
                return;
            }
            else if (stack.s[stack.top] == input[i]) {
                --stack.top;
                output[output_i++= '-';
            }
        }
    }
    for (i = 0; i < output_i; i++) {
        printf("%c\n", output[i]);
    }
}
cs



※ 느낀점 

1. 기능(function)에 printf는 절대 넣지 말자.

2. 문자열을 출력 하는 방법 2가지.

  - %s : 'n\'(null)을 만날때까지 출력. 

  - %c : for문 사용 (여기선 null이 없기 때문에)

3. 출력은 입력의 2배가 된다. (이 문제의 경우에서만!)



'Algorithm > solution' 카테고리의 다른 글

#10815. 숫자카드  (0) 2017.12.24
#1065. 한수  (0) 2017.12.24
#1654. 랜선자르기  (0) 2017.12.23
#11866. 조세퍼스 문제  (0) 2017.12.01
#10828. 스택  (0) 2017.11.29

+ Recent posts