티스토리 뷰

🍕readline 이란?

  • readline 모듈은 한 번에 한 줄씩 Readable 스트림 (예 : process.stdin)에서 데이터를 읽기위한 인터페이스를 제공합니다. 
  • readline 모듈은 데이터를 읽기위한 인터페이스를 제공해주는 모듈입니다. 

->백준 문제를 풀기 위한 경우라면, 입출력을 한줄씩 처리하는 모듈이라고 생각하면 됨

 

process.stdin 코드에 대한 설명▼

https://www.geeksforgeeks.org/node-js-process-stdin-property/

 

🍕기본 사용법 

1. 모듈 불러오기

2. 인터페이스 생성하기 

3. 입출력 처리하는 코드 작성 

const readline = require('readline'); //모듈 불러오기
const rl = readline.createInterface({
	input: process.stdin,
    output: process.stout,
}); //인터페이스 생성
rl.on('line', (line) =>{
/*입력받는 값을 처리하는 코드*/
	rl.close();
});

rl.on('close',()=>{
/*입력이 끝나고 실행할 코드*/
	process.exit();
});

// 위의 코드를 on.()메서드를 연결해서 쓸 수도 있음 (chaining)
rl.on('line', (line) =>{
/*입력받는 값을 처리하는 코드*/
	rl.close();
}).on('close',()=>{
/*입력이 끝나고 실행할 코드*/
	process.exit();
});

입력 코드 설명

rl.on(): 인터페이스가 가지는 on()메서드를 사용해 이벤트와 콜백함수를 전달한다. 위에서 사용된 이벤트는 'line' 이벤트와 출력 부분에 사용되는 'close' 이벤트가 있다.

'line' : 입력받는 값을 한 줄씩 읽어 문자열 타입으로 전달하는 역할을 하는 이벤트

/*입력 받는 값을 처리하는 코드*/ : 'line'이벤트로 받은 내용을 적절하게 처리하는 코드

rl.close(): 인터페이스를 종료함으로써 무한히 입력받는 것을 방지한다. 즉, rl.close()가 호출되면 입력이 끝났다는 것이고, 다음에 "close" 이벤트를 발생시켜 입력값을 활용하여 출력값을 도출하는 코드를 작성 

 

출력 코드 설명

'close': 더이상 입력되는 값이 없을 때 실행되는 이벤트이다. 

/*입력이 끝나고 실행할 코드*/ : 입력이 종료되었음을 알리는 'close'이벤트가 호출된 다음 입력값을 활용해 출력값을 도출하는 코드를 작성

process.exit() : 프로세스를 종료시킨다. 

 

🍕입력받은 값을 처리하는 방법 

-입력받은 값은 바로 사용하기 어렵다.

'line' 이벤트는 값이 한 줄씩 문자열 형태로 입력되어 저장된다. 예를 들어, 10 20 30은 실제로는 문자열 "10 20 30"으로 들어온다. 즉 개별의 숫자 형태로 들어오는 것이 아니라 한줄로 처리되서 문자열로 들어오는 것임 

 

따라서 문자열 "10 20 30"안에 들어있는 개별 값들을 사용할 수 있도록 배열 [10,20,30]의 형태와 같이 변환할 필요가 있다. 이를 /*입력받는 값을 처리하는 코드*/ 에서 처리하면 된다. 

 

▶경우1. 공백을 포함한 한 줄이 입력되는 경우

10 20 30 //한줄
  1. 개별 숫자 10,20,30을 사용하고 싶다면, 공백을 기준으로 나눠야 한다. .split(' ') 사용 // 공백이 아니라 쉼표면 쉼표로 나누면 됨
  2. 공백으로 나뉜 각각의 문자열을 숫자로 형변환 parseInt 혹은 Number()
  3. 배열에 개별 숫자들을 차례로 담기
const readline = require("readline");

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

// 'line'이벤트 이후 실행되는 콜백 함수의 param명은 원하는대로 작명해서 써도 됩니다. 
rl.on("line", (라인)=>{
    input = line.split(' ').map(element => parseInt(element));
   	rl.close();
});
    
rl.on("close", ()=>{
/*입력이 끝나고 실행할 코드*/
	process.exit();
});

※형변환에 대한 추가 개념 정리입니다. 건너뛰셔도 됨!

문자열을 숫자로 변환하는 방법(string to number)
주의) "1123"처럼 숫자로 된 문자열만 변환이 가능하다. 숫자가 아닌 경우, NaN반환

 

const input = [];
input = 문자열.split(' ').map(element => parseInt(element)); 
// 혹은 .map(element => +element);
// 혹은 .map(element => Number(element));
  1. parseInt(정수 문자열) , parseFloat(실수 문자열)
  2. Number(문자열) // Number 생성자 함수를 new 없이 활용하는 방법
  3. +(문자열) // 문자열 앞에 + 연산자를 붙여주면, 숫자로 형변환된다. 
  4. (문자열)*1 // 문자열에 *연산을 하면, 숫자로 형변환 된다. 

위의 방법은 Boolean to number 에도 적용된다. 

  • true -> 1, false -> 0 변환되며
  • parseInt, parseFloat에는 적용 X
  1. Number(불리언) 
  2. +(불리언)
  3. (불리언)*1
Number(true) // 1
Number(false) // 0

+ (true) // 1 
+ false // 0

(true) * 1 // 1
false * 1 // 0

출처: ref: https://curryyou.tistory.com/187 (카레유님)


▶경우2. 여러 줄이 입력되는 경우

10 //한 줄
20 //한 줄
30 //한 줄

line이벤트는 한 줄씩 읽어들이기 때문에, 각각의 입력을 한꺼번에 처리할 수는 없다. 

따라서 각각의 입력이 들어올 때마다 배열에 담아주는 형태로 작성해야 한다. 

array.push()메소드를 사용해서 차례대로 담으면 된다. 

//각각의 값들을 담을 빈 배열을 생성합니다.
const input = [];

//line에 입력값이 들어올 때마다 배열에 push해줍니다.
input.push(line);

//cf. 정수 형태로 push 하고 싶으면?
input.push(parseInt(line));
const readline = require("readline");

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

const input = [];

rl.on("line", (line)=>{
	input.push(line);
	rl.close();
});

rl.on("close", ()=>{
	/*입력이 끝나고 실행할 코드*/
	process.exit();
});

본문 ref: https://velog.io/@leenzy/readline-%EB%AA%A8%EB%93%88-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0

 

댓글