BOJ-10828

문제

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

명령은 총 다섯 가지이다.

push X: 정수 X를 스택에 넣는 연산이다.
pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
size: 스택에 들어있는 정수의 개수를 출력한다.
empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • 문제를 보고 쉽다고 생각했는데, 풀이법은 쉽지만 시간 초과나 백준에서 JS input을 받는 방법 같은 부분을 알 수 있게 되었음.

풀이

// https://www.acmicpc.net/problem/10828

const readLine = require("readline")
const rl = readLine.createInterface({
  input: process.stdin,
  output: process.stdout,
})

const stackArr = []
const output = []

const push = x => {
  stackArr.push(Number(x))
}

const pop = () => {
  const num = stackArr.pop()
  if (num) {
    output.push(num)
  } else {
    output.push(-1)
  }
}

const size = () => {
  output.push(stackArr.length)
}

const empty = () => {
  output.push(stackArr.length === 0 ? 1 : 0)
}

const top = () => {
  output.push(
    stackArr[stackArr.length - 1] ? stackArr[stackArr.length - 1] : -1
  )
}

let lineCount = 0
let isFirstLine = true

rl.on("line", line => {
  if (isFirstLine) {
    lineCount = Number(line)
    isFirstLine = false
  } else {
    const [cmd, value] = line.split(" ")

    const fn = {
      push,
      pop,
      size,
      empty,
      top,
    }

    if (fn[cmd]) {
      fn[cmd](value)
    }

    lineCount -= 1

    if (lineCount === 0) {
      console.log(output.join("\n"))
      process.exit(0)
    }
  }
}).on("close", () => process.exit(0))
  • 첫번째 입력을 어떻게 받아야할지 고민하다가 boolean으로 처리했는데 이렇게 처리하는게 좋은 방법인지 모르겠어서 검색해 보았다.
    • const [n, ...arr] = fs.readFileSync("/dev/stdin").toString().trim().split("\n");
    • 해당 방법으로 풀이하신 분이 계셔서 나중에 input을 받을 때도 이 방법으로 받으면 좋을 것 같긴 하나, split이 시간이 많이 소요되는거로 알고 있는데, 괜찮을지 모르겠다.
  • 다른 분들 풀이에는 push, pop, size, empty, top를 따로 선언하지 않고 처음부터 object안에 넣을 걸 그랬다.