티스토리 뷰
스택에 대해 알아보는 문제
한쪽 끝에서만 자료를 넣고 빼는 선형구조, LIFO
구현할 때는 자료의 위치 표시하는 pointer와 이를 이용한 push, pop 명령어를 사용한다.
분기문은 switch문이 제일 성능이 좋다고 옛날에 백준 문제 풀다가 알게 되었던 기억이 있을랑말랑함
이거 C#으로도 4년 전에 풀었던 문제라 포스팅 뒤져보면 나올 거 같음
solution과 입력 부분의 분리를 위해, 함수로 구현하였음
const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
let inputChartext = fs.readFileSync(filePath).toString().split('\n');
let inputcharfiltered = inputChartext.filter(value => value.length > 0);
let input;
if(inputcharfiltered.length > 1) { //여러줄일때, 내부 input-solution 처리필요
for(line in inputcharfiltered) {
const inputChar = inputcharfiltered[line].split(' ');
//숫자 처리
input = inputChar.map(x => +x);
}
} else { //한줄일때
const inputChar = inputcharfiltered[0].split(' ');
//숫자처리
input = inputChar.map(x => +x);
}
solution(inputcharfiltered);
function solution (inputarray) {
let count = +inputarray[0];
let stack = [];
let length = 0;
let result = [];
for(let i = 1; i < count+1; i++) {
let command = inputarray[i].split(' ');
switch(command[0]) {
case 'push':
stack[length++]=Number(command[1]);
// console.log('After Push : ' + stack);
// console.log('current length : ' + length);
break;
case 'pop':
if(length) {
result.push(stack[length-1]);
stack.splice(length-1, 1);
length--;
// console.log('After Pop : ' + stack);
// console.log('current length : ' + length);
} else { //stack is empty
result.push(-1);
}
break;
case 'size':
result.push(length);
break;
case 'empty':
if(length) {
result.push(0);
} else { //stack is empty
result.push(1);
}
break;
case 'top':
if(length) {
result.push(stack[length-1]);
} else { //stack is empty
result.push(-1);
}
break;
}
}
console.log(result.join('\n'));
}
경험한 문제점
1. \n과 \r
입력 문자열을 처리하는데 난데없는 \n이 아닌 \r이 붙어서 나타났다.
\r은 처음 봤는데, 얘도 \n과 같은 개행 문자열인데, 커서의 위치 차이가 있대나 뭐라나.
아무튼 갑자기 \r이 붙어서 split('\r')로 바꾸고 테스트 값이 훌륭히 나오는 것도 확인한 뒤
코드를 제출해보았으나 오답이라고 떴다.
그래서 이것저것 로그 체크를 하다가 발견한 게
\r은 사라지고 \n으로 변경되었다.

그래서 split('\n')으로 다시 바꿨더니 해당 문제는 해결되었다.
아직도 이유는 모르겠다... ㅎ
2. timeout
시간 초과...ㅎ
C# 할 때도 저거 때문에 골머리를 앓았는데 기어코 여기서도 같은 문제를 맞이하는구나 싶었다
console.log로 매번 출력하지 말고 모든 결괏값을 저장한 다음 출력해야 한다.
이 경우 결과를 담을 배열을 만들고 push 명령어로 결괏값을 쏙쏙 넣어준 다음,
마지막에 join('\n')을 추가해서 결과값을 한 번만 출력하도록 했다.
다른 사람들 코드를 구경하며 느낀 점은, 더 간결하게 가능하겠다는 점 정도?
if 문 대신 a? b:c로 간단하게 추릴 수 있겠더라.
그 외에도 push 명령어가 해당 배열의 수를 반환하기 때문에 length 관련해서 더 간결하고 직관적인 정리가 가능할 것 같다.
그거랑, let const var의 차이를 아직도 잘 모르겠다. 나중에 머... 찾아보자
'■ 알고리즘 > ◻ 백준' 카테고리의 다른 글
[Nodejs]9012번: 괄호 (0) | 2022.07.22 |
---|---|
[Nodejs]9093번: 단어 뒤집기 (0) | 2022.07.20 |
알고리즘 기초 문제 풀이 순서 (0) | 2022.07.20 |
[C#]백준 2750번 : 수 정렬하기 (0) | 2018.08.14 |
[C#]백준 10813번 : 공 바꾸기 (0) | 2018.08.14 |