[JS] 자바스크립트로 백준 입력받는 방법 총정리

Pakxe·2022년 9월 24일
10

JavaScript

목록 보기
1/16
post-thumbnail

마지막 수정일: 24년 5월 2일

상황

  1. 따로 ide(vsc 등)에서 실행하지 않고 바로 백준 입력창에서 푸는 경우
    -> 아래 코드 그대로 사용하면 된다.
  2. ide에서 돌려보고 실행하는 경우
    ->
    	const filePath = process.platform === 'linux' ? '/dev/stdin' : '[입력파일명].txt'?
        const input = require('fs').readFileSync(filePath).toString().trim().split('\n');

1. 한 글자 입력받기

var fs = require('fs');
var input = fs.readFileSync('/dev/stdin').toString().trim();
var n = input; 
//n에 입력값이 담긴다. 숫자라면 Number(input)를 사용한다. 

2. 공백을 기준으로 여러 글자(한 줄) 입력받기

let fs = require('fs');
let input = fs.readFileSync('/dev/stdin').toString().split(' ');
//input은 배열 자료형으로 담기므로 각 글자에 접근하려면 인덱싱으로 접근

3. 여러 줄 입력받기

const fs = require('fs');
const input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");
//input에 각 줄이 배열 자료형으로 담기므로 각 줄에 접근하려면 인덱싱으로 접근

4. 첫 줄에 자연수 n을 받고, 다음 줄에 공백으로 구분된 여러 값 입력

const fs = require('fs');
const [n, ...arr] = fs.readFileSync("/dev/stdin").toString().trim().split(/\s/);
// split(/\s/)의 의미에 대해서는 추후 포스팅

5. 첫 줄에 자연수 n을 받고, 다음줄부터 여러 개의 줄에 걸쳐 한 줄에 하나의 값을 입력받을 때

const fs = require('fs');
const [n, ...arr] = fs.readFileSync("/dev/stdin").toString().trim().split("\n");

입력받는 값들을 모두 String -> Number 로 바꾸고 싶다면 split()뒤에 .map(Number)를 추가한다.

이론

백준에서 Node.js로 입력받는 방법은 두 가지가 있다.
1. readline 모듈
2. fs 모듈

1번보다는 2번이 빠르므로 2번을 사용하는 것이 좋겠다.

뭔지 모르고 사용하는 것보단 알고 사용해보자.
1번 한글자 입력받기에 대해 알아보자.

var fs = require('fs');

1줄: 이 코드는 FileSystem의 약자인 fs모듈을 불러오는 코드다.
fs 모듈은 파일 처리와 관련된 모듈이다. 이 안에 포함되어 있는 메소드가 굉장히 많다.
전부 공부하는 것보단 필요할 때 골라서 공부하는 식이 좋겠다.

var input = fs.readFileSync('/dev/stdin').toString().trim();

2줄: fs.readFileSync(filename, [options])와 같은 형태로 사용한다.
의미는 filename의 파일을 [option]의 방식으로 읽은 후 Buffer 객체를 반환한다는 뜻이다. 이 작업은 동기적으로 수행된다. (sync가 붙은 것은 동기적 읽기이다. 따라서 비동기인 readFile 메소드도 있음을 예상가능)
readFileSync의 인수로 인코딩을 지정해주지 않으면 Buffer 객체를 반환한다. 따라서 문자열로 바꿔주지 않으면 사용하기 어렵겠다.

(문자열로 바꾸지 않을 경우)

반환값을 문자열로 바꾸기 위해서는

  • toString()메서드 연결
  • 문자열 연결 연산
  • readFileSync의 두번째 인수([option])로 인코딩 지정

(1번 방법으로 형변환해 타입과 함께 출력한 모습)

trim()은 문자열 양 끝의 공백+개행문자 들을 지우기 위해 사용한다.
입력의 끝에 개행문자(\n)이 입력으로 들어올 때가 종종 있으므로 사용한다.

(split메서드는 들어있는 값을 기준으로 문자열을 분할해 배열에 담는 메서드다. 입력 값의 마지막에 개행문자가 포함되어 있는 경우 split('\n')은 공백 문자 하나를 더 갖고 있는 배열을 반환한다. 이는 원하던 동작이 아니므로 이를 방지하기 위해서 trim() 을 사용한다.)

주로 사용하는 것

나는 보통 아래의 양식으로만 사용한다.

const filePath = process.platform === 'linux' ? '/dev/stdin' : '[입력파일명].txt'?
const input = require('fs').readFileSync(filePath).toString().trim().split('\n');

하나의 입력인 경우 input[0]처럼 접근하면 된다.

더 알고싶어진 것

  • split 메서드
  • require
  • readline
profile
내가 꿈을 이루면 나는 또 누군가의 꿈이 된다.

1개의 댓글

comment-user-thumbnail
2023년 7월 26일

좋은 글 감사합니다. 덕분에 자바스크립트로 백준문제 풀이를 할 수 있었습니다!

답글 달기