
백준에 있는 Stack을 활용한 3가지 문제를 해결 했습니다.
기본기 다진다는 생각으로 stack 을 활용하여
괄호제거, stack의 push pop 활용 하기, stack 구현하기를 진행했습니다.
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의 남은 괄호가 있는지 판단하여 답을 도출 해낼 수 있었습니다.
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()를 사용하여 총합을 구하는 방식으로 문제를 해결했습니다.
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 문을 돌면서 매칭되는 메서드가 실행 될 수 있도록 구현하여 해결했습니다.
오늘은 난이도가 쉬운 편이었던것 같습니다. 내일은 좀 더 다양한 유형의 문제를 풀어볼수 있도록 해야겠습니다.