[백준] Node.js fs모듈로 입력값 받기

Noma·2021년 8월 26일
2

백준에서 Node.js로 입력값을 받기 위해선 readline 모듈 또는 fs 모듈을 사용하면 된다. 이 둘 중 fs모듈이 더 빠르므로 fs를 사용하도록 한다.

➕(수정) 문제를 풀다보면 fs로는 컴파일 에러가 나는 경우가 있다. 그럴땐 readline을 사용해야 한다.

fs는 FileSystem의 약자로 파일 처리를 하는 모듈로, 직접 입력 파일을 읽어와서 처리한다.

아래는 상황에 따라 값을 입력 받는 방법이다.

const fs=require('fs');

//1. 하나의 값을 입력받을 때
const input=fs.readFileSync('/dev/stdin').toString().trim();

//2. 공백으로 구분된 한 줄의 값들을 입력받을 때
const input=fs.readFileSync('/dev/stdin').toString().trim().split(' ');

//3. 여러 줄의 값들을 입력받을 때
const input=fs.readFileSync('/dev/stdin').toString().trim().split('\n');

//4. 첫 번째 줄에 자연수 n을 입력받고, 그 다음줄에 공백으로 구분된 n개의 값들을 입력받을 때
const input=fs.readFileSync('/dev/stdin').toString().trim().split(/\s+/);
const [n,...arr]=input; 

//5. 첫 번째 줄에 자연수 n을 입력받고, 그 다음줄부터 n개의 줄에 걸쳐 한 줄에 하나의 값을 입력받을 때
const input=fs.readFileSync('/dev/stdin').toString().trim().split('\n');
const [n,...arr]=input;

const [n,...arr]=input;과 같이 Destructuring assignment(구조 분해 할당)을 이용하면 좀 더 깔끔하게 분리할 수 있다.

🔍 정규 표현식 정리

  • + : 앞의 표현식이 1회 이상 연속으로 반복되는 부분과 대응된다. {1,} 와 같은 의미
  • \s : 스페이스, 탭, 폼피드, 줄 바꿈 문자 등을 포함한 하나의 공백 문자에 대응된다.

toString( )을 쓰는 이유

문자열을 입력 받는다면 toString()을 안붙여도 될 것 같지만, fs.readFileSync('/dev/stdin')의 반환값은 Buffer 객체이다. fs.readFileSync('/dev/stdin', 'utf8')와 같이 인수로 인코딩을 지정해주지 않으면 Buffer 객체가 반환됨

따라서 문자열로 바꿔주지 않으면 예상치 못한 오류가 날 수 있다.

trim( )을 쓰는 이유

일부 입력값의 마지막에 개행문자가 포함된 경우가 종종 있다. 이런 경우 split('\n')할 경우 공백문자 하나를 더 갖는 배열을 반환한다. 이를 방지하기 위해 trim()을 사용한다.

const text = '가\n나\n다\n';
console.log(text.split('\n')); // ['가', '나', '다', '']
console.log(text.trim().split('\n')); // ['가', '나', '다']

참고자료

https://tesseractjh.tistory.com/39

profile
오히려 좋아

0개의 댓글