코딩테스트 연습

백준 10828 - 스택

gurwhddl 2023. 4. 17. 16:23

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

 

10828번: 스택

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

www.acmicpc.net

스택을 push, pop 없이 구현해봄

const fs = require("fs");
let input = fs
  .readFileSync("./test.txt")
  .toString()
  .trim()
  .split("\n")
  .map((v) => v.split(" "));
const arr = [];
let size = 0;
let result = "";
for (let i of input) {
  const command = i[0];
  if (command === "push") {
    arr[size] = parseInt(i[1]);
    size++;
    continue;
  }
  if (command === "pop") {
    if (size === 0) {
      result += -1 + "\n";
      continue;
    }
    result += arr[size - 1] + "\n";
    size--;
  }
  if (command === "size") {
    result += size + "\n";
    continue;
  }
  if (command === "empty") {
    if (size === 0) {
      result += 1 + "\n";
    } else {
      result += 0 + "\n";
    }
  }
  if (command === "top") {
    if (size === 0) {
      result += -1 + "\n";
    } else {
      result += arr[size - 1] + "\n";
    }
    continue;
  }
}
console.log(result);

스택은 들어간 순서대로 쌓이기 때문에 내가 값을 넣을거라면 기존 값들 제일 뒤에 위치해야 함 - 기존 값이 몇개가 있는지를 알고 있어야함

arr - 스택 구현할 배열 / size - 스택에 몇개있는지?(배열 길이 체크용)

size는 0으로 시작해서 push 할때마다 arr[size] = n , size ++ 

pop은 size --만 해주면 됨

- 값은 여전히 남아있겠지만 어차피 size의 값이 하나 줄어들었기 때문에 pop 된것처럼 행동하게 됨

size는 말그대로 size이고

empty도 말그대로 size 값만 체크해주면 되고

top은 제일 마지막 값 = arr[size-1] 의 값을 리턴해주면 됨

 

*출력값이 매우 길기 때문에 결과마다 console.log 해주면 시간초과남 - result라는 배열에 문자열로 다 저장해놨다가 한번에 출력

*스택은 제일 뒤에 위치하는 원소 빼고는 나머지 확인은 원칙적으로는 불가능 - 배열을 이용하기 때문에 사실 가능은 하지만 원칙적으로는 불가능