Baekjoon 문제 자바스크립트로 풀기
백준 온라인 문제풀이 사이트에서 자바스크립트를 이용해서 알고리즘을 풀려고 했더니 자바스크립트 언어는 없고, node.js밖에 없어 사용법을 찾아보았다.
1. fs를 활용하여 입출력하기
var fs = require('fs');
var input = fs.readFileSync('/dev/stdin').toString().split(' ');
var a = parseInt(input[0]);
var b = parseInt(input[1]);
console.log(a+b);
이 방식은 백준 언어 정보에 나와있는 방식으로, 노드의 파일 시스템에 접근할 수 있는 모듈을 사용하는 것이다.
모듈이기 때문에 require을 통해 fs를 불러온다
파일을 읽는 함수는 readFile과 readFileSync가 존재하는데, readFile은 동기식 함수, readFileSync은 비동기식 함수이다.
'/dev/stdin' 경로로 접근해 입력 값을 배열 형태로 저장하고, 배열의 값을 하나씩 변수에 할당한 후 계산하는 방식으로 구현할 수 있다.
하지만 백준 상에서 코드가 틀리지 않았지만 런타임 에러(EACCES)를 받는 경우가 존재한다고 하는데
이는 권한이 없어서 생기는 에러로, 위의 경로를 입력한 경우에 몇몇 문제에서 발생하는 오류라고 한다.
따라서 이러한 경우에는 경로에 'readFileSync('/dev/stdin')' 대신 'readFileSync(0, 'utf-8')' 으로 사용할 것을 권장하고 있다.
2. readline를 활용하여 입출력하기
const readline = require('readline').createInterface({
input: process.stdin,
output: process.stdout,
});
let input = [];
readline.on('line', function(line) {
input = line.split(' ').map(el => parseInt(el));
}).on('close', function(){ //이 안에 솔루션 코드 작성
const A = parseInt(input[0]);
const B = parseInt(input[1]);
console.log(A+B);
process.exit();
});
이 방식은 readline 모듈을 활용하여 입출력을 하는 것이다.
똑같이 require을 통해 불러온 후, createInterface 메서드를 활용하여 인스턴스를 생성한다.
input과 output을 지정해준 뒤, on 메서드를 통해 이벤트와 콜백함수를 전달한다.
자주 쓰이는 이벤트에는 'line' 이벤트와 'close' 이벤트가 있다.
- line : 입력받은 값을 한 줄씩 읽어 문자열 타입으로 전달하는 이벤트
- close : 더 이상 입력 값이 없을 경우에 해당하는 이벤트
또한 콜백함수 내부 메서드에는 '*.close()'와 'process.exit()'가 있다.
- *.close() : 인터페이스를 종료하여 무한 입력 방지
- process.exit() : 프로세스를 종료
위의 이벤트와 메서드를 활용해 입력 값을 원하는 형태로 변환해서 저장한 뒤, 결과 출력 후 종료 메서드를 통해 종료할 수 있다.
출처
https://velog.io/@bami/Node.js-%ED%8C%8C%EC%9D%BC-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EB%AA%A8%EB%93%88
https://help.acmicpc.net/language/info/all
https://www.acmicpc.net/board/view/137718
https://velog.io/@pexe99/JavaScript-readline-%EA%B7%B8%EA%B2%8C-%EB%AD%94%EB%8D%B0