Notice
Recent Posts
Recent Comments
Link
관리 메뉴

윤일무이

[JavaScript] 백준 코딩테스트 : 스택 본문

⚙️ 코딩테스트

[JavaScript] 백준 코딩테스트 : 스택

썸머몽 2023. 6. 29. 11:15
728x90

📌  문제

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

명령은 총 다섯 가지이다.

  • push X: 정수 X를 스택에 넣는 연산이다.
  • pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • size: 스택에 들어있는 정수의 개수를 출력한다.
  • empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
  • top: 스택의 가장 위에 있는 정수를 출력한다만약 스택에 들어있는 정수가 없는 경우에는 -1 출력한다.

📌  입력

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

📌  입출력 예

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

📌  예제 입력 및 출력


📌  풀이

알아야 하는 것

  • 백준에서 Node.js를 사용해 문제를 풀 경우 console.log를 최대한 적게 써야 한다. (참고)
    • 처음에 분명 맞는 답이 나왔고 VSC나 콘솔에서도 문제가 없는데 자꾸만 시간초과가 떴다. 알고 보니 for문 안의 console.log가 시간을 많이 잡아 먹어서 그런 거였다. 출력을 해야 할 때마다 console.log를 찍어서 답을 출력했는데, 이렇게 하면 구조를 완전히 바꿔야 했다.

구할 것

  • 실제로 연산을 진행할 stack 배열과 바로 정답을 출력할 answer 배열 2개를 만들었다.
  • 정수 X를 스택에 넣을 push X의 경우 "push 123" 이런 식으로 입력값이 들어오기 때문에, for문을 돌았을 때 push를 includes 하고 있다면 공백을 기준으로 split해서 ["push", "123"]의 1번째 인덱스를 push하도록 했다.
  • case문으로 써도 됐을 것 같은데 그건 손에 익지가 않아서 그냥 조건에 맞게 if-else if문으로 처리하고 이항연산자로 세부 조건을 설정했다.
    • 예컨대 top의 경우 스택의 가장 위의 정수를 출력해야 하는데 스택에 정수가 없다면 === 스택의 length가 0이라면 -1을 answer에 push하고, 그렇지 않다면 스택의 가장 우측에 있는 값을 answer에 push 하는 코드를 짰다. empty, pop도 이와 비슷하다. size도 stack의 length를 answer에 push하면 됐다.
  • 정답률이 37%길래 어려운 줄 알았는데 생각보다 너무 쉽게 풀려서 내가 잘못 한 건줄 알았다... 왜지?
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");
const num = input[0].split(" ");

let stack = [];
let answer = [];

for (let i = 1; i < input.length; i++) {
  if (input[i].includes("push")) {
    let pushNum = input[i].split(" ");
    stack.push(Number(pushNum[1]));
  } else if (input[i] === "top") {
    stack.length === 0 ? answer.push(-1) : answer.push(stack[stack.length - 1]);
  } else if (input[i] === "size") {
    answer.push(stack.length);
  } else if (input[i] === "empty") {
    stack.length === 0 ? answer.push(1) : answer.push(0);
  } else if (input[i] === "pop") {
    stack.length === 0 ? answer.push(-1) : answer.push(stack.pop());
  }
}

console.log(answer.join("\n"));

 

 

728x90