ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 10828. 스택
    Baekjoon 2023. 4. 9. 01:20

     문제 

    정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.

    명령은 총 다섯 가지이다.

    push X: 정수 X를 스택에 넣는 연산이다.

    pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.

    size: 스택에 들어있는 정수의 개수를 출력한다.

    empty: 스택이 비어있으면 1, 아니면 0을 출력한다.

    top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다. 

     

     입력 

    첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.

    14
    push 1
    push 2
    top
    size
    empty
    pop
    pop
    pop
    size
    empty
    pop
    push 3
    empty
    top

     

     출력 

    출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.

    2
    2
    0
    2
    1
    -1
    0
    1
    -1
    0
    3

     

     에러 

    더보기

    자꾸 맨 마지막 값만 출력되고 나머지 값이 출력이 안됐다. . .

    이유를 몰라서 1시간 동안 log 엄청 찍으면서 찾았는데. . .

    변수에 top 들어간 것도 맞고, case 'top' 써둔 것도 맞는데 top으로 안들어가고 자꾸 디폴트로 들어감. . .

    왜그러는지 찾으려고 변수 == 'top' 했더니 false 랜다. . . 왜 그러는지 진짜 이해가 안됐다. . .

    진짜 끙끙 헤맸는데 알고보니 값을 받을 때 trim()을 안해서 그랬다. . .

    trim()은 공백 지워주는 함수다. . . 그러니까 변수에 'top'이 들어간게 아니고 ' top'이나 'top ' 이렇게 들어갔겠지...?

    trim() 하나로 에러 해결됐다. . . 여러분은 나같은 바보짓 하지 말기를. . .

     

    + .push() 나 .pop() 사용하지 않은 이유

    처음엔 그렇게 했는데 그럼 백준에 제출시 시간초과 뜨더라

    자바스크립트 내장메서드를 많이 사용하면 시간초과 뜸 ^ㅁ^

    그래서 마지막에 한번만 썼다 헤헤. . . 결과는 맞았습니다!!

     

     제출 코드 

    const fs = require("fs");
    const readFileSyncAdd = "10828.txt";
    const input = fs.readFileSync(readFileSyncAdd).toString().split('\n');
    
    const stack = [];
    let res = '';
    
    const len = input.shift();
    
    for (let i = 0; i < len; i++) {   
        const cmd = input[i].split(' ')[0].trim();   
        let ans = '';  
    
        switch(cmd) {
            case 'pop': 
                if (stack.length == 0) 
                {
                    ans = -1;  
                }
                else 
                { 
                    ans = stack.splice(-1); 
                }
                res += ans + ' ';
                break;
    
            case 'size': 
                ans = stack.length; 
                res += ans + ' ';  
                break;
    
            case 'empty': 
                if (stack.length == 0)
                {
                    ans = 1;
                }
                else 
                {
                    ans = '0';
                }
                res += ans + ' ';
                break;
    
            case 'top': 
                if (stack.length == 0) 
                {
                    ans = -1;
                }
                else {
                    ans = stack.slice(-1).join(' ');
                }
                res += ans + ' ';
                break; 
    
            case 'push': 
                const pushItem = input[i].split(' ')[1]
                stack.push(pushItem);
                break;
        }
    } 
    console.log(res.split(' ').join('\n'));

    'Baekjoon' 카테고리의 다른 글

    11655. ROT13  (0) 2023.05.02
    10845. 큐  (0) 2023.05.02
    10820. 문자열 분석  (0) 2023.05.02
    1157. 단어 공부  (0) 2023.04.09
    9093. 단어 뒤집기  (0) 2023.04.09
Designed by Tistory.