페블_
반짝이는 시냅스
페블_
전체 방문자
오늘
어제
  • 전체글 보기 (96)
    • QA (0)
    • 프로젝트 회고 (4)
    • 프로젝트 과정 기록 (12)
    • UI 구현 연구일지 (8)
    • Front-end (31)
      • Javascript (7)
      • CSS (10)
      • React (5)
      • Typescript (3)
      • Nextjs (3)
      • 스타일링 라이브러리 (3)
    • Back-end (0)
      • Express (0)
      • DB (0)
    • CS (0)
      • 자료구조 & 알고리즘 (0)
    • CI&CD (1)
    • 툴 사용법 (4)
      • Git (1)
      • Library&패키지 (2)
      • 기타 개발관련 (1)
    • 알고리즘 이론 & 풀이 (36)
      • 백준(BOJ) (14)
      • 프로그래머스 (22)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • chartjs
  • 토이프로젝트
  • 파이썬
  • 개발블로그_시작
  • 캐러셀
  • Python
  • 알고리즘
  • 백준
  • 선형대수학
  • react
  • TypeScript
  • emotion
  • 생각
  • storybook
  • eslint
  • JS
  • UI 컴포넌트
  • 시리즈_표지

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
페블_

반짝이는 시냅스

알고리즘 이론 & 풀이/프로그래머스

프로그래머스 Lv.0 - 직각삼각형 출력하기 +) nodejs readline

2023. 7. 6. 01:55

문제

https://school.programmers.co.kr/learn/courses/30/lessons/120823

 

 

문제 자체는 어렵지 않다. 다만 아래처럼 nodejs의 readline 모듈을 이용해 입출력을 받아야 해서 당황했는데, 차근차근 해석하면 로직을 어디에 작성해야 할 지 알 수 있다.

const readline = require('readline');

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

let input = [];

rl.on('line', function (line) {
    input = line.split(' ');
}).on('close', function () {
    console.log(Number(input[0]));
});

 

Readline 이해하기

nodejs 문서

1) readline이란

The node:readline module provides an interface for reading data from a Readable stream (such as process.stdin) one line at a time.

한번에 한 줄씩 stream으로부터 데이터를 읽을 수 있게 해주는 interface를 제공하는 모듈이다.

일단 readline 모듈을 불러온다.

const readline = require('readline');

 

2) readline.createInterface(options)

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

readline.Interface의 인스턴스를 생성한다. 파라미터로 option을 넘겨줄 수 있다.

이렇게 여러 개가 있는데 그 중 input과 output을 보자.

  • input - 입력을 받을 stream. 여기서는 process.stdin으로부터 stream을 받기로 하였다.
  • output - 마찬가지로 쓰기를 할 stream

 

3) rl.on으로 'line', 'close' 이벤트 수신

rl.on('line', function (line) {
    input = line.split(' ');
}).on('close', function () {
    console.log(Number(input[0]));
});

rl.on() 은 이벤트와 콜백함수를 인자로 받는다. 콜백함수는 그 이벤트가 실행되었을 때 수행할 작업이다.

  • line 이벤트 - 한 줄을 입력받을 때 촉발된다.
  • close 이벤트 부분 - 입력이 끝났을 때 촉발된다.

만약 '1 2 3'이라는 값을 입력받았다면 이것은 그냥 문자열에 불과하기 때문에 입력을 받은 순간 split(' ')을 통해 [1, 2, 3]으로 바꿔주고 있다. 그리고 입력이 끝나면 할 일을 rl.on('close', callback)의 콜백함수 부분에 작성해주면 된다.

 

위처럼 Promise와 같은 체인 형태로 쓸 수도 있고 아래처럼 따로 쓸 수도 있다.

rl.on('line', (line) => {
  input = line.split(' ');
});
rl.on('close', (line) => {
  console.log(Number(input[0]));
});

 

💻 풀이

그러니까 이 문제를 풀기 위해서는 close 부분에 로직을 작성하면 된다.

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

let input = [];

rl.on('line', function (line) {
    input = line.split(' ');
}).on('close', function () {
    const n = Number(input[0]);
    for(let i = 1; i <= n; i++) {
        let str = '';
        for(let k = 1; k <= i; k++) {
            str += '*'
        }
        console.log(str);
    }

});

 

💻 repeat으로 풀이 개선

repeat으로 안쪽 반복문 하나를 줄일 수 있었다.

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

let input = [];

rl.on('line', function (line) {
    input = line.split(' ');
}).on('close', function () {
    const n = Number(input[0]);
    let str = '';
    for(let i = 1; i <= n; i++) {
        console.log('*'.repeat(i));
    }
});

'알고리즘 이론 & 풀이 > 프로그래머스' 카테고리의 다른 글

프로그래머스 Lv.0 | 공던지기  (0) 2023.07.08
프로그래머스 Lv.0 | 구슬을 나누는 경우의 수  (0) 2023.07.07
프로그래머스 Lv.0 | 최빈값 구하기  (0) 2023.07.05
프로그래머스 Lv.0 | 분수의 덧셈  (0) 2023.07.02
프로그래머스 Lv.0 | 자릿수 더하기  (0) 2023.06.30
    '알고리즘 이론 & 풀이/프로그래머스' 카테고리의 다른 글
    • 프로그래머스 Lv.0 | 공던지기
    • 프로그래머스 Lv.0 | 구슬을 나누는 경우의 수
    • 프로그래머스 Lv.0 | 최빈값 구하기
    • 프로그래머스 Lv.0 | 분수의 덧셈
    페블_
    페블_

    티스토리툴바