[JS] 입출력 시간초과, 빈 어레이 체크, node.js 실행(BOJ 10828)

HongBeen Lee·2021년 9월 28일
0

Algorithms

목록 보기
1/15
post-thumbnail

백준 10828

  • 자바스크립트로 백준문제를 처음풀어봐서 입력방식에 당황했다....
  • 일단 전체코드는 이렇다.
// 1. 입력받기
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
const input = fs.readFileSync(filePath).toString().split("\n");

// 2. 변수 초기화
let stack = [];
let answer='';
const num = input[0];

// 3. 알고리즘 구현
for (let i = 1; i <= num; i++) {
	if (input[i].indexOf("push")>=0) {
		let x = input[i].split(' ');
		stack.push(x[1]);
		continue;
	} else {
		switch (input[i]) {
			case "pop":
				if (stack.length) answer+=stack.pop()+'\n';
				else answer+="-1"+'\n';
				break;
			case "size":
				answer+=stack.length+'\n'
				break;
			case "empty":
				if (stack.length) answer+="0"+'\n';
				else answer+="1"+'\n';
				break;
			case "top":
				if (stack.length) answer+=Number(stack.slice(-1))+'\n';
				else answer+="-1"+'\n';
				break;
		}
	}
}
console.log(answer);

1. 입력받기

자바스크립트는 app.js 파일로 작성하여 저장한다.

입력부분을 보면,

const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
const input = fs.readFileSync(filePath).toString().split("\n");
  1. node.js에서 fs 모듈을 사용하여 입력을 받는다.

    fs모듈의 속도가 빠르지만 fs의 경우 예제 입력 파일에 접근해야 하기 때문에
    일부 문제에서는 "런타임 에러 (EACCES)" 형태의 접근권한 오류가 나타납니다. ( ex) 문제 : 14681 사분면 고르기 )
    ...
    일부 문제에서는 시간제한 문제가 있습니다. 이 때 readline을 사용하면 시간초과가 되는 경우도 있습니다.
    출처: https://hanch-dev.tistory.com/4 [HanCh_Dev]

  2. 백준에서 채점할 때는 리눅스 기반에서 직접 입력을 받지만,
    내 로컬에서 코드를 짤 때는 입력예시를 txt파일로 저장해놓고 받아서 쓴다.
    매우 편하다😂😂😂

    input.txt파일은 app.js 파일과 같은 폴더에 저장한다.

  3. 받은 파일을 읽어서 input 어레이에 저장한다.
    여러줄이기 때문에 split("\n")으로 나누어 저장했지만, 한 줄 입력이라면 split(" ")으로 적용한다.


2. 변수 설정

let stack = [];
let answer='';
const num = input[0];
  • stack으로 사용할 빈 어레이를 만들어준다.
  • answer로 사용할 빈 문자열을 생성한다.
  • 입력마다 console.log()를 실행하면 시간초과가 발생 하므로, answer에 모두 더했다가 출력은 최종 answer 한 번만 출력한다.
  • 반복할 횟수 num을 저장한다.
    ---

3. 알고리즘 구현

push

  • push일 때는 indexOf 함수를 사용하여 push가 있는지 판단한다.
  • 어레이와 스트링 모두 쓸 수 있는 함수이다.
  • 해당 문자열의 인덱스를 반환하므로, 0이상이면 존재하고 -1이면 존재하지 않는 조건문을 작성한다.
  • push 123과 같이 공백 한 칸을 두고 수가 있기 때문에 split(' ')으로 나누어, 집어넣을 수를 가져온다.

그 외

  • switch문으로 구분하여 케이스 별로 처리한다.
  • if(stack.length)로 스택이 비었는지 판단한다. 길이가 0이라면 false, 1이상이라면 true이다.
  • 출력해야 할 때마다, answer에 문자열을 합해준다.
for (let i = 1; i <= num; i++) {
  //push인 경우
	if (input[i].indexOf("push")>=0) {
		let x = input[i].split(' ');
		stack.push(x[1]);
		continue;
	} 
  // 그 외 경우
  else {
		switch (input[i]) {
			case "pop":
				if (stack.length) answer+=stack.pop()+'\n';
				else answer+="-1"+'\n';
				break;
			case "size":
				answer+=stack.length+'\n'
				break;
			case "empty":
				if (stack.length) answer+="0"+'\n';
				else answer+="1"+'\n';
				break;
			case "top":
				if (stack.length) 		answer+=Number(stack.slice(-1))+'\n';
				else answer+="-1"+'\n';
				break;
		}
	}
}
console.log(answer);

+) 코드 실행시키기

터미널에서
node --version 으로 노드가 설치되어있는지 확인하고,
node app.js로 실행시켜주면 끝!


스택 자료구조문제인데 입력방식에 당황해서 자바스크립트의 스택을 제대로 활용하지 못한 것 같다......킄... 다른 스택문제는 스택스럽게 풀어봐야겠다.

profile
🏃🏻‍♀️💨

0개의 댓글