Jaeilit

백준 스택수열 1874 js 본문

알고리즘

백준 스택수열 1874 js

Jaeilit 2022. 10. 25. 14:42
728x90

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

 

18258번: 큐 2

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

www.acmicpc.net

 

문제 이해하는데 1시간은 걸린거같다.

스택에 n 까지의 숫자가 들어간다는 거를

1씩 더해서 1 2(1+1) 이런식으로 들어간다고 이해를 해서 1시간 걸렸다.

 

여튼..

 

일단 틀린 내 코드

 

const fs = require("fs");

const filePath =
  process.platform === "linux" ? "/dev/stdin" : "./준/스택/1874/input.txt";

const [n, ...ary] = require("fs")
  .readFileSync(filePath)
  .toString()
  .trim()
  .split("\n")
  .map(Number);

let stack = [];
let num = [];

let count = 0;
let index = 0;

while (count <= ary.length) {
  if (!ary[index]) break;

  if (count !== ary[index]) {
    num.push(count + 1);
    stack.push("+");
    count++;
  } else {
    while (ary[index] && num[num.length - 1] === ary[index]) {
      if (num.pop() === ary[index]) {
        stack.push("-");
        index++;
      }
    }
  }
}

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

for 문으로 돌리기에는 루프 횟수가 부정확해서 while 을 써야하는 줄 알았다.

count 는 1, 2, 3, 4 ... n 까지의 숫자이고

index 는 포인터라 생각하면 된다. 배열의 0번 부터 읽어 올것.

 

예) count = 1 index=0 ary[index] = 4 이기 때문에 첫번째 if 문에 걸려서

count 가 4가 될때까지 + 해준다. 

 

그리고 현재 ary[index] 4가 1 2 3 4 로 넣어주던 num 배열의 마지막 숫자랑 같은지 체크를 해서

pop 값이랑 ary[index] =4 와 같을 때까지 - 해준다.

 

결론은 30% 조금넘어서 출력초과가 나왔다.


정답코드

 

const fs = require("fs");

const filePath =
  process.platform === "linux" ? "/dev/stdin" : "./준/스택/1874/input.txt";

const [n, ...arr] = require("fs")
  .readFileSync(filePath)
  .toString()
  .trim()
  .split("\n")
  .map(Number);

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

let count = 1;

for (let i = 0; i < n; i++) {
  let num = arr[i];

  // 아무조건 없이 + 8개를 넣는다
  while (count <= num) {
    stack.push(count);
    count++;
    answer.push("+");
  }

  let stackpop = stack.pop();
  answer.push("-");

  if (stackpop !== num) {
    answer = ["NO"];
    break;
  }
}

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

로직 ...

for 문으로 일단 n 까지의 숫자를 while 문으로 넣어준다.

 

예)  첫 while

num = 4 , count 1, 2, 3, 4, stack = [1, 2, 3, 4]

그 다음 while 이 종료되고 4에서 멈춘 stack 배열에 pop 을 해주고 - 를 넣어준다.

stack = [1, 2, 3 ]

 

다시 num = 3 count 4가 num 보다 작으므로 while 은 pass 되고

배열에 pop 해주고 - 를 넣어준다. stack = [1 ,2 ]

 

--- answer = [ +, + , + , + , - ,- ]

 

3 번째 루프에서는 num = 6 count = 4 while 을 6까지 돌아준다. stack = [1, 2, 5, 6]

 

이런 로직으로 진행된다.

 

로직 상 많은 부분이 보장된다는 전제하에 이뤄진 코드 같다.

뭐.. 예외에 대한 no 부분 때문일수도 있겠다.

 

 

 

 

728x90

'알고리즘' 카테고리의 다른 글

프로그래머스 할인행사 js  (0) 2023.06.13
귤 고르기 js  (0) 2023.05.25
백준 ATM 11399 js  (0) 2022.10.21
백준 구간 합 구하기 4 11659 js  (0) 2022.10.19
백준 좌표압축 18870 js  (0) 2022.10.17