Poylib
기록형 프론트엔드
Poylib
전체 방문자
오늘
어제
  • 분류 전체보기 (91)
    • Programing (38)
      • Javascript (17)
      • Typescript (1)
      • React (9)
      • React-Native (6)
      • Git (4)
      • Next (1)
    • Study (36)
      • Algorithm (35)
      • Etc. (1)
    • Record (17)
      • Memoirs (12)
      • Group (5)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Git
  • 알고리즘
  • 백준
  • vite
  • 자바스크립트
  • Object
  • react-native
  • javascript
  • 코딩테스트
  • react
  • ReactNative
  • 기초
  • 코칭스터디
  • 리액트
  • Error
  • typescript
  • 프로그래머스
  • 회고

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Poylib

기록형 프론트엔드

<BEAKJOON / node.js> 10828 스택
Study/Algorithm

<BEAKJOON / node.js> 10828 스택

2022. 4. 29. 15:19
https://www.acmicpc.net/problem/10828

스택을 이용한 문제는 처음 풀어보았는데, if와 else if 문으로 짜다가 에러의 벽을 넘지 못했다,,

다른 분들의 코드를 참조해서 해결했는데, 문제를 어떤 방식으로 해결하셨는지 분석해본다.

const input = [];
require("readline")
  .createInterface(process.stdin, process.stdout)
  .on("line", (line) => {
    input.push(line);
  })
  .on("close", () => {
    console.log(solution(input));
    process.exit();
  });

//////////////백준 입출력///////////////

function solution(input) {
  const stack =[];
  let top = 0;
  let answer = "";
  let cmdObj = {
    push : (x) => {
      stack[top++] = x
    },
    pop : () => {
      if(top) {
        top--;
        return stack.splice(-1);
      }
      return -1;
    },
    size : () => top,
    empty : () => (top ? 0 : 1),
    top : () => (top ? stack[top-1] : -1)
  };

  input.slice(1).map((str) => {
    const [cmd,num] = str.split(" ");
    if( cmd === "push") cmdObj[cmd](+num);
    else answer += `${cmdObj[cmd]()}\n`;
  });
  return answer;
};

메서드와 객체를 활용한다는 건 이런 거구나 싶을 정도로 많은 공부가 되는 코드다.

 

1.

 const stack =[];
  let top = 0;
  let answer = "";

stack이라는 공간을 만들어두고, top과 answer에 명령이 오가게 변수를 만들어 둔다.

top은 숫자를 받기 위해 0을 뒀지만 answer 는 문자열을 받기 위한 형태로 저장되어 있는데 명령이 top나 empty 같은 문자열이 들어가도 어쨌든 출력은 숫자가 나와야 하는 게 아닌가? 하고 0으로 초기화시켜서 돌려보았다.

answer =0; 으로 두면 첫 번째 top 명령에서 알맞은 출력인 2가 아니라 02가 출력된다. 아마 마지막에 answer가 받는 게 백틱으로 싸여 있어 문자열을 받도록 초기화시킨 것 같은데, 추후 확실하게 알게 되면 수정해야겠다.

 

2.

let cmdObj = {
    push : (x) => {
      stack[top++] = x
    },
    pop : () => {
      if(top) {
        top--;
        return stack.splice(-1);
      }
      return -1;
    },
    size : () => top,
    empty : () => (top ? 0 : 1),
    top : () => (top ? stack[top-1] : -1)

 

 

push명령이 들어오면 x로 받은 인수가 stack의 top++ 인덱스에 저장된다. 증감연산자가 있기에, 그럼 첫 번째 push부터 stack[1]에 저장되는 것인가 싶었다. 

증감연산자는 전위, 후위로 나뉘게 되는데 push 처럼 후위 연산자를 사용하면 1 증가하기 전 값이 연산 결과로 출력된다. 즉 첫 번째 push에서 (top이 없는 상태) stack[0]에 push하고, top에 1을 더하는 것.

let a=1,b=1;
console.log(a++,++b); // 1, 2

empty와 top의 삼항 조건연산자는 true와 false를 반대로 나타낼 수 있다.

empty : () => (top ? 0 : 1)
empty : () => (!top ? 1 : 0)

! 를 사용하면 true인 것을 false로, false인 것을 true로 받게 한다.

 

3.

  input.slice(1).map((str) => {
    const [cmd,num] = str.split(" ");
    if( cmd === "push") cmdObj[cmd](+num);
    else answer += `${cmdObj[cmd]()}\n`;
  });
  return answer;
};

const [cmd, num] = ~   식별자 자리에 배열이나 객체가 오는 구조 분해 할당이다. 알아야 할 내용이 많으므로 좀 더 공부해서 따로 글을 써두도록 해야겠다. 프로퍼티 접근 방식으로 대괄호 표기법도 알게 되었다. 여태까진 마침표 표기법으로 객체를 다루기에 충분했으나, 이번 문제처럼 대괄호 표기법으로만 접근 가능한 때가 있다.

const arr = [1,2,3];
const [one, two,three] = arr;
console.log(one,two,three); // 1 2 3

 

4.

평소 백준 문제를 제출하던 데로 fs 모듈을 이용해서 입력을 받았으나 이렇게 작성한 코드는 런타임 에러가 뜬다.

왜,,, 인지는 node.js를 공부해야 알 수 있는 것인지 찾기 어려워 readline으로 제출했다.

 

****

원래 만들던 방식은 switch 문으로도 가능했다.

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

const stack = [];
const result = [];

const len = array.shift();

for (let i = 0; i < len; i++) {        
    switch(array[i]) {
        case 'pop': 
          result.push(stack.pop() || -1);
          break;

        case 'size': 
          result.push(stack.length);
          break;

        case 'empty': 
          result.push(stack[0] ? 0 : 1);
          break;

        case 'top': 
          result.push(stack[stack.length - 1] || -1);
          break;

        default: 
          stack.push(array[i].split(" ")[1]);
          break;
    }
}

console.log(result.join('\n'));
저작자표시 비영리 변경금지 (새창열림)

'Study > Algorithm' 카테고리의 다른 글

[BEAKJOON / node.js] 5533 유니크  (0) 2022.05.02
[programmers / JavaScript] 숫자 문자열과 영단어  (0) 2022.04.30
<BEAKJOON> 4344 JavaScript  (0) 2022.04.26
<programmers / JavaScript> 직사각형 별찍기  (0) 2022.04.14
<BEAKJOON> 14681 JavaScript  (0) 2022.03.31
    'Study/Algorithm' 카테고리의 다른 글
    • [BEAKJOON / node.js] 5533 유니크
    • [programmers / JavaScript] 숫자 문자열과 영단어
    • <BEAKJOON> 4344 JavaScript
    • <programmers / JavaScript> 직사각형 별찍기
    Poylib
    Poylib
    모시깽 기록

    티스토리툴바