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 |