티스토리 뷰
🍕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 //한줄
- 개별 숫자 10,20,30을 사용하고 싶다면, 공백을 기준으로 나눠야 한다. .split(' ') 사용 // 공백이 아니라 쉼표면 쉼표로 나누면 됨
- 공백으로 나뉜 각각의 문자열을 숫자로 형변환 parseInt 혹은 Number()
- 배열에 개별 숫자들을 차례로 담기
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));
- parseInt(정수 문자열) , parseFloat(실수 문자열)
- Number(문자열) // Number 생성자 함수를 new 없이 활용하는 방법
- +(문자열) // 문자열 앞에 + 연산자를 붙여주면, 숫자로 형변환된다.
- (문자열)*1 // 문자열에 *연산을 하면, 숫자로 형변환 된다.
위의 방법은 Boolean to number 에도 적용된다.
- true -> 1, false -> 0 변환되며
- parseInt, parseFloat에는 적용 X
- Number(불리언)
- +(불리언)
- (불리언)*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
'코딩테스트 > 연습문제' 카테고리의 다른 글
[프로그래머스 | 0단계] 배열의 유사도, 옷가게 할인받기, 중앙값 구하기 (0) | 2023.01.19 |
---|---|
[수학문제] 100! 의 끝에 0의 개수는 몇이나 있을까? (0) | 2022.11.03 |
[백준 | node.js] 백준문제 2588번 (JS 자동 형변환) (0) | 2022.04.25 |
[Node.js] fs모듈, readFile() readFileSync() (0) | 2022.04.22 |
[Node.js] node js 기초 (0) | 2022.04.21 |
- Total
- Today
- Yesterday
- text input pattern
- 타입스크립트 DT
- 프리온보딩 프론트엔드 챌린지 3월
- ~ ^
- grid flex
- && 셸 명령어
- tilde caret
- nvm 설치순서
- float 레이아웃
- 부트캠프항해
- D 플래그
- 틸드와 캐럿
- 원티드 프리온보딩 FE 챌린지
- 항해99추천비추천
- getStaticPaths
- 항해99프론트후기
- reactAPI
- 항해99프론트
- getServerSideProps
- 타입스크립트 장점
- nvm경로 오류
- fs모듈 넥스트
- Prittier
- is()
- 원티드 3월 프론트엔드 챌린지
- 프리렌더링확인법
- aspect-ratio
- 형제 요소 선택자
- 원티드 FE 프리온보딩 챌린지
- 원티드 프리온보딩 프론트엔드 챌린지 3일차
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |