쾌락코딩

Node.js 입력 받기

|

프로그래머스같은 경우는 입력이 자동으로 되기 때문에 함수만 작성하면 된다. 그러나 구름ide 또는 백준 알고리즘 같은 경우 테스트 케이스 입력을 받기 위한 코드를 작성해야한다. Node.js로 입력을 받는데 헤맨 부분이 있어 입력 받는 방법을 간단하게 정리해보기로 했다.

readline

백준 사이트에서 javascript로 풀어진 몇 예제를 보면

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

이렇게 입력을 받는 것을 볼 수가 있는데, 여기서 경로는 알고리즘 사이트마다 다르기 때문에 보편적으로 사용할 수 없다.

인터넷에 예제들을 보면 대부분 readline을 사용하고 있다. 기본적인 형태는 아래와 같다.

const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

rl.on("line", function(line) {
  console.log("hello !", line);
  rl.close();
}).on("close", function() {
  process.exit();
});

위 코드는 사용자로 부터 한 줄의 입력만 받고 프로그램이 끝나게 된다. 만약 위의 코드에서

rl.close()

부분이 없다면 무한으로 입력을 받으며 받은 만큼 실시간으로 console.log를 찍는다.

간단한 예제로 두 수를 공백으로 구분지어 입력받은 후 합을 구해 출력하는 코드를 살펴보자.

const readline = require('readline');
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

let input = [];

rl.on('line', function (line) {
    input = line.split(' ').map((el) => parseInt(el));
  })
  .on('close', function () {
    console.log(input[0] + input[1]);
    process.exit();
  });

// 입력 : 1 2
// 출력 : 3

여기서 알아두어야 할 점은, 이 코드를 콘솔에서 실행하게 되면 close 이벤트에 걸리지를 않아서 console.log가 찍히지 않고, 입력만 계속해서 받게 된다. 그 이유는 콘솔에서 실행했기 때문이다. 콘솔에서는 interactive shell이 계속 열려있기 때문에 자동으로 close가 호출되지 않는다. 그러나 이 코드를 구름 ide에서 실행하게 되면 EOF에 걸리게 되어 정상적으로 console.log가 찍힌다.

(백준 사이트나 구름 IDE 같은 경우 알고리즘을 테스트하기 위한 테스트 데이터들이 파일에 존재한다. 콘솔에서 실행하면 키보드로부터 입력을 받기 때문에 계속해서 입력 이벤트를 대기하게 되지만, 파일을 받게 되는 경우에는 파일의 데이터가 끝이나면 자동으로 EOF에 걸려 close되어 코드가 끝나는 것이다.)

만약 두 줄, 세 줄의 입력을 받아야 한다면 아래와 같이 할 수 있다.

const readline = require('readline');
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

let input = [];

rl.on('line', function (line) {
    input.push(line)
  })
  .on('close', function () {
    console.log(input);
    process.exit();
});

콘솔에서 close를 하는 방법

일반적으로 콘솔에서는 계속해서 입력 이벤트를 기다리고 있기 때문에 close가 실행되지 않는다. 그러나 리눅스의 경우 콘솔에서 ctrl + D 를 입력하면 EOF에 걸리게 된다(윈도우라면 gitbash를 통해 node파일을 실행시킨 후 입력이 다 되었다면 ctrl + D를 누르면 된다). 위의 코드의 경우 1 -> enter -> 2 -> ctrl + D 를 입력하면 된다.

결론

입출력이 간단한 경우에는 크게 무리가 없을 것 같지만 입력이 상당히 많아질 경우 복잡해 질 것 같긴하다. 사람들이 js로 알고리즘을 잘 안푸는 이유가 있긴 있는 것 같다ㅠㅠ

Comments