algorithm challenge__24.03.05

석원·2024년 3월 5일

algorithm_challenge

목록 보기
2/3
post-thumbnail

백준에 있는 Stack을 활용한 3가지 문제를 해결 했습니다.

기본기 다진다는 생각으로 stack 을 활용하여
괄호제거, stack의 push pop 활용 하기, stack 구현하기를 진행했습니다.

9012

const fs = require('fs');
// const input = fs.readFileSync('/dev/stdin').toString().split('\n');
const input = fs.readFileSync('./9012.txt').toString().split('\n');


/**
 * 괄호가 짝이 맞는지 확인하여 짝이 맞다면 YES 아니면 NO
 */
const solution = () => {

    let stack = [];
    const line = Number(input[0]);
    let result = '';
    let isError = false;
    for(let i = 1; i < line + 1; i++) {
      isError = false;
      for(let j = 0; j <input[i].length; j++) {
        if(input[i][j] === ')') {
          if(stack.length === 0) {
             result += 'NO\n';
             isError = true;
             break;;
          } else stack.pop();
        }
        else stack.push(input[i][j]);
      }
      if (!isError) {
        if(stack.length === 0) result += 'YES\n';
        else result += 'NO\n';
      }
      
      stack = [];
    }
    console.log(result);
}


solution();

isError flag를 활용하여 중간에 정확하지 않은 괄호가 발생했는지 확인 해줄 수 있도록 했고, 에러가 발생하지 않았다면 stack의 남은 괄호가 있는지 판단하여 답을 도출 해낼 수 있었습니다.

10773

const fs = require('fs');
// const input = fs.readFileSync('/dev/stdin').toString().split('\n');
const input = fs.readFileSync('./10773.txt').toString().split('\n').map(Number);

/**
 *  첫번째 줄에 정수 K
 *  이후 K개의 줄에 정수가 1개씩 주어진다.
 *  정수가 0이 들어오면 최근에 쓴 수를 지우고 아닐경우 해당 수를 쓴다. 
 */
const solution = () => {
  const stack = [];
  const line = input[0];
  
  for(let i = 1; i < line + 1; i++) {
    if(input[i] === 0) {
      stack.pop();
    } else {
      stack.push(input[i]);
    }
  }
  console.log(stack.reduce((a, b) => a + b, 0));
}

solution();

입력받은 값이 0이 나오면 pop을 해주고, 최종적으로 reduce()를 사용하여 총합을 구하는 방식으로 문제를 해결했습니다.

28278

const fs = require('fs');
// const input = fs.readFileSync('/dev/stdin').toString().split('\n');
const input = fs.readFileSync('./28278.txt').toString().split('\n')
/**
 * 입력으로 주어지는 명령을 처리하는 프로그램 작성하기
 * 
 * 1 X: 정수 X를 스택에 넣는다. (1 ≤ X ≤ 100,000)
 * 2: 스택에 정수가 있다면 맨 위의 정수를 빼고 출력한다. 없다면 -1을 대신 출력한다.
 * 3: 스택에 들어있는 정수의 개수를 출력한다.
 * 4: 스택이 비어있으면 1, 아니면 0을 출력한다.
 * 5: 스택에 정수가 있다면 맨 위의 정수를 출력한다. 없다면 -1을 대신 출력한다.
 */
const solution = () => {
  
  class Stack {
    constructor() {
      this.stack = [];
    }
    pushNum(num){
      this.stack.push(num);
    }
    // 2
    popAndPrint() {
      if(this.stack.length !== 0) {
        const popV = this.stack.pop();
        return popV
      } else {
        return -1;
      }
    }

    // 3
    size() {
      return this.stack.length;
    }

    // 4
    isEmpty() {
      return this.stack.length === 0 ? 1 : 0;
    }

    // 5
    printTop() {
      if(this.stack.length !== 0) {
        return this.stack[this.stack.length - 1];
      } else {
        return -1;
      }
    }
  }

  let myStack = new Stack();
  const line = Number(input[0]);
  let result = "";
  
  for(let i = 1; i < line + 1; i++) {
    if(!isNaN(Number(input[i]))) {
      switch(Number(input[i])) {
        case 2:
          result += myStack.popAndPrint();
          break;
        case 3:
          result += myStack.size();
          break;
        case 4:
          result += myStack.isEmpty();
          break;
        case 5:
          result += myStack.printTop();
          break;
        default :
          break;
      }
      result += "\n";
    } else {
      const [a, b] = input[i].split(' ');
      myStack.pushNum(b);
    }
  }

  console.log(result);
}

solution();

Stack Class를 구현할 때, 명령어 처리에 필요한 메서드를 내부에 구현 해두고, 입력받은 값에 따라 switch 문을 돌면서 매칭되는 메서드가 실행 될 수 있도록 구현하여 해결했습니다.

오늘은 난이도가 쉬운 편이었던것 같습니다. 내일은 좀 더 다양한 유형의 문제를 풀어볼수 있도록 해야겠습니다.

0개의 댓글