본문 바로가기

코딩/알고리즘

백준) 10828 - 스택 JS

📌 문제 링크

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


📌 문제 탐색하기

  • 정수를 저장하는 스택을 구현하고 주어진 명령의 순서에 따라 알맞은 출력값을 처리
  • 명령
    • push X: 정수 X를 스택에 넣는 연산
    • pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력
    • size: 스택에 들어있는 정수의 개수를 출력
    • empty: 스택이 비어있으면 1, 아니면 0을 출력
    • top: 스택의 가장 위에 있는 정수를 출력. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력

시간복잡도

  • O(n)

알고리즘 선택

  • 스택

📌 코드 설계하기

  1. 정수를 저장할 `stack` 배열과 최종 결과를 반환할 `answer` 배열을 선언합니다.
  2. 입력된 명령들을 순서대로 처리하기 위해 for문을 사용합니다.
  3. 주어진 명령어에 맞는 코드를 작성합니다.
  4. `push`로 시작된다면 숫자를 가져와 `stack`에 넣어줍니다.
  5. `top`이면 `stack`의 마지막 요소를 가져오거나 없으면 `-1을 `answer`배열에 넣어줍니다.
  6. `pop`이면 `stack`의 마지막 요소를 반환하거나 `-1`을 출력합니다.
  7. `size`면 `answer`에 `stack`의 길이를 넣어줍니다.
  8. `empty`면 `stack`의 길이를 확인하고 `answer`에 `0` 또는 `-1`을 넣어줍니다.
  9. 마지막에 `answer`값을 출력합니다.

📌 정답 코드

const fs = require("fs");
const filePath =
  process.platform === "linux" ? "/dev/stdin" : __dirname + "/input1.txt";
const [_, ...input] = fs.readFileSync(filePath).toString().trim().split("\n");

const stack = [];
const answer = [];
for (const x of input) {
  if (x.startsWith("push")) {
    stack.push(x.split(" ")[1]);
  }
  if (x === "top") answer.push(stack.at(-1) || -1);
  if (x === "pop") answer.push(stack.pop() || -1);
  if (x === "size") answer.push(stack.length);
  if (x === "empty") {
    answer.push(stack.length === 0 ? 1 : 0);
  }
}
console.log(answer.join("\n"));

 

6달 전엔 switch로 풀었구나.....

//https://www.acmicpc.net/problem/10828
export {};

const fs = require("fs");
const filePath =
  process.platform === "linux" ? "/dev/stdin" : __dirname + "/input.txt";

const input = fs.readFileSync(filePath).toString().trim().split("\n");

function solution(input: string[]) {
  const stack: number[] = [];
  const answer: number[] = [];
  for (const x of input) {
    switch (x) {
      case "pop":
        answer.push(stack.pop() || -1);
        break;
      case "size":
        answer.push(stack.length);
        break;
      case "empty":
        answer.push(stack.length === 0 ? 1 : 0);
        break;
      case "top":
        answer.push(stack.at(-1) || -1);
        break;
      default:
        if (!Number(x)) {
          stack.push(Number(x.split(" ")[1]));
        }
        break;
    }
  }
  console.log(answer.join("\n"));
}

solution(input);

'코딩 > 알고리즘' 카테고리의 다른 글

백준) 28279 - 덱 2 JS  (1) 2024.11.18
백준) 18258 - 큐2 JS  (0) 2024.11.17
백준) 2231 - 분해합 JS  (0) 2024.11.15
백준) 2798 - 블랙잭 JS  (0) 2024.11.14
백준) 2587 - 대표값2  (1) 2024.11.13