본문 바로가기
Algorithm

[Algorithm] Node.js 알고리즘 문제 입력값 받기 readline Interface 사용

by 개발자 염상진 2022. 5. 8.

 

How Can I console input value in Node.js (Using Javascript readline interface)

 

Javascript 입력값 받는 방법

Javascript로 알고리즘을 풀기 위해서는 기본적으로 입력값을 받아와야 한다. Javascript를 사용할 때 대부분 HTML의 엘리먼트들의 input value만을 가져오다가 콘솔창에서 입력을 받는게 굉장히 어색하게 느껴진다. 

 

Javascript에서 입력값을 받기 위해서는 readline 모듈을 사용한다. 먼저 readline을 가져와서 인터페이스 객체를 생성한 후 프로세스 사이의 input과 output을 사용하면 된다.

 

const readline = require("readline");​

 

한줄 입력 받는 방법

 

readline 모듈을 가져온 후 readline을 사용하는 인터페이스를 생성해준다. 객체를 생성할 때는 input, output context를 매개변수로 받아서 생성하게 됨.

 

const readline = require("readline");

const readSingle = readline.createInterface({
    input : process.stdin,
    output : process.stdin,
})

 

readline 인터페이스를 사용해서 이벤트 로직을 작성해준다. 입력받을 때의 이벤트 값은 'line'을 사용한다. 만약 이벤트가 완료되면 close 이벤트를 작성해서 process를 종료해준다.

 

// 모듈 추가
const readline = require("readline");

// readline 인터페이스 생성
const readSingle = readline.createInterface({
    input : process.stdin,
    output : process.stdin,
})

// line Event 생성
readSingle.on("line", (item)=>{
    readSingle.close();
})

// clse Event 생성
readSingle.on("close", ()=>{
    process.exit();
})

 

Javascript에서 콘솔 입력을 받고 출력하는 가장 기본적인 로직이 완성되었다.

 

공백을 포함한 입력값

 

백준 알고리즘에서는 공백을 포함하는 문자열을 입력받는 경우가 있다. 이 경우 위의 기본 입출력 로직을 사용해서 입력값을 파싱한 후 리스트 형식으로 받아오면 된다.

 

모듈을 가져오고 readline 인터페이스를 생성하는 부분은 동일한 로직을 사용하면 된다.

 

// 입력값을 담을 배열 생성
var inputList = [];

// 공백을 기준으로 문자열을 나누고, Int 형 데이터로 새로운 배열 생성
readSingle.on("line", (item)=>{
    inputList = item.split(' ').map((e)=>parseInt(e));
    readSingle.close();
})

readSingle.on("close", ()=>{
    inputList.forEach((item)=>{
        console.log(item);
    })
    process.exit();
})

 

 

 

여러 줄 입력받는 방법

 

여러 줄의 입력을 받기 위해서는 line 이벤트에서 close 이벤트를 호출하지 않고 계속해서 line 이벤트를 실행한다. 입력을 받는 로직이 계속 되기 때문에, 종료하기 위해서는 Ctrl+c를 눌러 강제로 종료해준다.

 

입력 로직이 종료되면 close 이벤트가 활성화되고, 배열로 받았던 입력값들을 한번에 출력해준다. close 이벤트 마지막 로직은 프로세스를 완전히 종료하는 exit 메소드를 호출한다.

 

const readline = require("readline");

const readSingle = readline.createInterface({
    input : process.stdin,
    output : process.stdin,
})

var resultList = [];

readSingle.on("line", (item)=>{
    resultList.push(item.split(' ').map((e)=>parseInt(e)));   
})



readSingle.on("close", ()=>{
    resultList.forEach((item)=>{
        console.log(item);
    })
    process.exit();
})

 

 

 

 

댓글