ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Node.js/백준/스택] 10828번 스택 / pop, push, 삼항연산, switch문
    To infinity/Coding Practice 2022. 3. 16. 17:37

    2022.03.16 수

    Question

     

    10828번: 스택

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

    www.acmicpc.net


    How to solve?

    이건 풀었다기 보다는 답을 보고 어떤 구조로 알고리즘을 짰는지 분석했다 보는게 맞는 듯 하다.

     

    참, 거짓으로 판명되는 조건을 물어볼때는 삼항연산자(조건문? true : false)나 논리연산자를 쓰면 될 것 같다.

    왜냐하면 모든값이 true or false로 반환되니 1 or 0 으로 반환되는 것과 마찬가지니 말이다.

     

    스택은 LILO로 배열이 가로로 있을 땐 가장 오른쪽, 그리고 세로로 있을 땐 가장 위쪽이라고 생각하면 된다.

    배열의 가장 마지막에 (배열의 가장 위에) 값을 넣는 array.push와

    배열의 가장 마지막 값 (배열의 가장 위의 값)을 빼는 array.pop으로 스택을 구현할 수 있다.

     

    아래는 코드에 대한 설명을 주석으로 달아놓았다.

    const input = require('fs').readFileSync('/dev/stdin').toString().split('\n');
    //세로로 줄바꿈되어있는 정보를 줄바꿈을 기준으로 문자열로 바꿔 배열로 가져온다.
    //결과값: input = [14, push 1, push 2, top, size, ...]
    
    const len = input.shift();
    //array.shift() : 가장 처음에 있는 요소를 배열에서 제거한 후 결과로 반환한다. 큐(Queue)구조를 만들 수 있다.
    //결과값: 14
    
    const stack = [];
    // 정수를 저장하는 빈 배열을 만든다.
    
    const result = [];
    // 결과값을 담을 빈 배열을 만든다.
    
    for (let i = 0; i < len ; i ++) {
      switch (input[i]) {
        //input의 각 인덱스 조건값 중 아래 case에 해당하는 결과를 반한다. 다중조건값에 대한 조건문을 만들 수 있다.
    
        case "pop":
          result.push(stack.pop() || -1);
          //"스택에서 가장 위에 있는 정수를 빼고": 가장 나중에 들어온 값을 의미하므로 array.pop()을 사용한다. 해당값을 결과로 반환한다.
          //"그 수를 출력한다.": 해당값을 result 배열에 넣는다. array.push()를 사용하면 가장 위에(마지막에) 요소를 추가한다.
          //"만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.": 정수가 없다는 의미는 undefined로 출력되고, 논리연산의 경우엔 undefined는 false가 된다.
          //||(논리합)은 둘중 하나라고 true가 있으면 true를 반환하므로 -1을 반환하게 된다.
        break;
    
        case "size":
          result.stack.length;
          //"스택에 들어있는 정수의 개수를 출력한다": 스택의 길이를 구하는 조건을 쓰면 된다.
        break;
    
        case "empty":
          result.push(stack[0] ? 0 : 1)
          //"스택이 비어있으면 1, 아니면 0을 출력한다": 비어있단 의미는 첫번째 값이 없단소리다. 즉, 'undefined'이다.
          //그렇다면 조건문에서 undefined == fasle이기 때문에, 삼항조건문(조건? true:false)에서 false일 때 출력되는 값인 1을 뒤쪽에 배치시키면 된다.
        break;
    
        case "top":
          result.push(stack[stack.length-1] || -1)
          //"스택의 가장 위에 있는 정수를 출력한다.": 가장 나중에 들어온 값을 의미한다. 하지만 배열에서 '빼는것'이 아니라 '출력만'하기에 위에서 사용한 'pop'은 쓰면 안된다.
          //스택의 가장 마지막에 있는 값을 출력하기 위해 인덱스를 사용하자. 마지막 값의 인덱스는 길이에서 1을 뺀 값과 동일하다.
          //"만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.": 이는 push에서 설명한 것과 동일하다.
          break;
        
        default:
          //위 모든 조건에 해당하지 않는 경우
          result.push(input[i].split(' ')[1]);
          //'push'의 경우엔 입력이 'push 1' 이렇게 띄어쓰기로 구분된 두가지 값으로 구성되어 있다. 따라서, 띄어쓰기를 기준으로 배열로 바꿔서, 배열의 두번재 인덱스를 값으로 가져온다.
          break;
      }
    }
    
    console.log(result.join('\n'))
    //각 결과값이 한줄씩 엔터된 상태로 반환되어야 함으로 array.join을 이용하여 입력받은 구분자로 연결한 문자열을 빈환시킨다.

     


    Reference

    https://gurtn.tistory.com/67

     

Designed by Tistory.