들어가기에 앞서
여태까지 백준에서 파이썬으로 알고리즘을 풀었어서 몰랐었는데, JS로 풀려니까 입력 값을 어떻게 받아야 할지 의문이었다.
구글링을 해보니 알 수 없는... 무시무시하게 긴 코드들이 나와 지레 겁을 먹고 좀 더 용이한 프로그래머스로 빤스런을 했으나 오늘 한 문제를 만나면서 다시 그 긴 코드들을 마주하게 되어 그냥 찬찬히 뜯어보기로 했다.
readline 모듈
내가 본 그 무시무시한 코드는 readline 모듈이었다.
이 모듈은 Readable Stream에서 한 번에 한 줄씩 데이터를 읽기 위한 인터페이스를 제공하는 모듈이라고 한다.
먼저 이 모듈을 불러온다.
const readline = require("redaline");
다음으로 데이터를 읽기 위한 인터페이스를 생성해보자.
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
이제 입력을 받을 코드 / 입력값대로 실행할 코드를 만들어보자.
rl.on("line", (line)=>{
/*입력 받는 값을 처리하는 코드*/
rl.close();
});
rl.on("close", ()=>{
/*입력이 끝나고 실행할 코드*/
process.exit();
});
**입력**
1) rl.on() : 인터페이스가 가진 on() 매서드를 사용해 이벤트와 콜백 함수를 전달한다.
2) "line" : 입력값을 한 줄씩 읽어 '문자열'로 전달하는 역할을 하는 이벤트다.
3) rl.close() : 인터페이스를 종료해 무한히 입력 받는 것을 막는다. 이 이벤트가 호출되지 않으면 입력이 끝나지 않는다.
**출력**
1) "close" : 더 이상 입력되는 값이 없을 때 실행되는 이벤트다. 앞에서 rl.close()를 해줘야 하는 이유다.
2) process.exit() : 프로세스를 종료시킨다.
정리하자면...
내가 풀었던 문제를 예시로 정리해보자.
const readline = require('readline'); //모듈 불러오기
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
}); //인터페이스 생성
rl.on('line', function (line) {
input = line; //input 값을 line을 통해 문자열 타입으로 전달 받음
}).on('close', function () {
let inputNum = Number(input); //ex. 문자열 '3'을 정수 3으로 변경
for (let i = 1; i <= inputNum; i++) {
console.log('*'.repeat(i))
}
});
내가 푼 문제는 정수 n이 주어졌을 때 '*'을 사용해 높이와 너비가 n인 직각 이등변 삼각형을 출력하는 것이었다.
n = 3이라면 아래와 같은 모양이 리턴되어야 했다.
*
**
***
이렇게 푸는 문제인데 line은 input 값을 문자열로 받는다고 했다.
해당 부분을 정수로 바꿔준 후 일반적인 for문처럼 풀어주었다.
꽤 오래 머리를 싸맸던 문제였는데 알아보니 생각보다 빨리 이해할 수 있어 다행이었...
는데 한 줄에 여러 값을 입력 받는 경우 / 여러 줄로 여러 번 입력 받는 경우 등 여러 경우의 수가 또 있었다 ^_ㅠ
일단은 해당 알고리즘 풀이에 필요했던 기본적인 내용만 정리하고, 또 새로운 유형을 만나면 정리해보겠다.
**참고
'👋🏻 JavaScript > 📖 자바스크립트 ES6+' 카테고리의 다른 글
[JavaScript] map() 이란? (0) | 2023.04.25 |
---|---|
[JavaScript] splice와 slice 비교하기 (0) | 2023.04.19 |
[JavaScript] 정규 표현식 공부하기 3 (0) | 2023.03.26 |
[JavaScript] 정규 표현식 공부하기 2 (0) | 2023.03.26 |
[JavaScript] 정규 표현식 공부하기 1 (0) | 2023.03.26 |