[백준 | 1874 | 자바스크립트] 스택 수열

문제

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

 

정답 코드

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

const input = fs
  .readFileSync(filePath)
  .toString()
  .split("\n")
  .map((i) => Number(i));

function solution(input) {
  const result = [];
  const count = input[0];
  const stack = [];
  let stackNumber = 1;

  for (let i = 1; i <= count; i++) {
    while (stackNumber <= input[i]) {
      stack.push(stackNumber);
      result.push("+");
      stackNumber++;
    }

    if (stack[stack.length - 1] === input[i]) {
      result.push("-");
      stack.pop();
    } else {
      return ["NO"];
    }
  }

  return result;
}

console.log(solution(input).join("\n"));

 

풀이

문제를 읽고 어떻게 풀라는 것인지 이해가 안갔다. 그래서 이것저것 찾아보며 문제 이해부터 했다.

 

문제 이해하기

예시

4
1
2
4
3

// 출력 
+
-
+
-
+
+
-
-

아래 흐름으로 문제 먼저 이해해보았다.

 

초기 상태

  • 스택: [] (비어 있음)
  • 현재 push 가능한 숫자: 1부터 시작

1. 첫 번째 숫자: 1

  • 현재 스택: []
  • 수열의 첫 번째 숫자 1을 만들기 위해 push.
  • push 1 → 스택: [1] → 연산: +
  • 스택의 맨 위 숫자 1이 수열의 첫 번째 숫자 1과 같으므로 pop.
  • pop → 스택: [] → 연산: -

2. 두 번째 숫자: 2

  • 현재 스택: []
  • 수열의 두 번째 숫자 2를 만들기 위해 push.
  • push 2 → 스택: [2] → 연산: +
  • 스택의 맨 위 숫자 2가 수열의 두 번째 숫자 2와 같으므로 pop.
  • pop → 스택: [] → 연산: -

3. 세 번째 숫자: 4

  • 현재 스택: []
  • 수열의 세 번째 숫자 4를 만들기 위해 push 연산으로 3, 4를 넣어야 한다.
  • push 3 → 스택: [3] → 연산: +
  • push 4 → 스택: [3, 4] → 연산: +
  • 스택의 맨 위 숫자 4가 수열의 세 번째 숫자 4와 같으므로 pop.
  • pop → 스택: [3] → 연산: -

4. 네 번째 숫자: 3

  • 현재 스택: [3]
  • 스택의 맨 위 숫자 3이 수열의 네 번째 숫자 3과 같으므로 pop.
  • pop → 스택: [] → 연산: -

 

문제 풀이

  • result : 스택 연산 기록을 저장
  • stack : 스택 데이터 구조
  • stackNumber : 스택에 넣을 숫자 추적 (1부터 시작)

 

while (stackNumber <= input[i]) {
  stack.push(stackNumber);  // 스택에 숫자 추가
  result.push("+");  // 연산 기록
  stackNumber++;  // 다음 숫자로 이동
}
  • 현재 수열의 값(input[i])을 만들기 위해, 스택에 숫자를 오름차순으로 추가(push)
  • stackNumber를 하나씩 증가시키며 스택에 값 쌓기
  • 각 push 연산은 "+"로 기록

 

if (stack[stack.length - 1] === input[i]) {
  result.push("-");  // 연산 기록
  stack.pop();  // 스택에서 숫자 제거
} else {
  return ["NO"];  // 수열을 만들 수 없는 경우
}
  • 스택의 맨 위 값(stack[stack.length - 1])이 수열의 값(input[i])과 같다면, 스택에서 값을 제거(pop)
  • pop 연산은 "-"로 기록
  • 만약 스택의 맨 위 값이 수열의 값과 다르다면, 주어진 수열을 만들 수 없으므로 즉시 "NO"를 반환

 

'코딩문제풀기' 카테고리의 다른 글

[백준/10828] 스택  (0) 2024.06.05
[백준/10430] 나머지  (0) 2024.06.02
[백준] 2753 | 윤년 | Javacsript  (0) 2024.05.11
[백준/18108] 1998년생인 내가 태국에서는 2541년생?!  (0) 2024.05.01
[백준/10926] ??!  (0) 2024.04.27