백준 node js 입력 받기

개발 log·2023년 3월 4일
2

알고리즘

목록 보기
11/11
post-thumbnail

이 글은 javascript로 알고리즘을 공부하는 많은 분들이 백준을 좀 더 편하게 사용했으면 좋겠으면하는 마음에 남기는 글이다.

서론따위 생략하겠다.
참고로 필자는 백준에서 추천하는 fs(파일 시스템)보다 readline을 선호한다.
(fs는 런타임 에러가 나는 문제가 종종 있다고 한다.)

입력 방식 1

1 2

const readline = require('readline');

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

let data;

const main = (data) => {
  // 함수 작성
}

const lineEvent = (line) => {
  data = line
  rl.close()
}

const closeEvent = () => {
  console.log(main(data));
  process.exit();
}

rl.on('line', lineEvent)
  .on('close', closeEvent);

입력 방식 2

9
123456789

const readline = require('readline');

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

let data;

const main = (data) => {
  // 함수 작성
}

const lineEvent = (line) => {
  line = line.trim();

  if (Number.isNaN(Number(line))) {
    data = line
    rl.close()
  }
}

const closeEvent = () => {
  console.log(main(data));
  process.exit();
}

rl.on('line', lineEvent)
  .on('close', closeEvent);

입력 방식 3

4
13 7 5
7 13 6
14 3 12
15 6 16
0

const readline = require('readline');

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

const main = (data) => {
  // 함수 작성
}

let input = [];

let temp_count = 0;
let temp_input = [];

const lineEvent = (line) => {
  line = line.trim();

  if (!Number.isNaN(Number(line))) {
    if (line.length && Number(line) === 0) rl.close()
    temp_count = Number(line)
    temp_input = []
  } else if (temp_count > 0) {
    temp_count--
    temp_input.push(line.split(' ').map((num) => Number(num)));

    if (temp_count === 0) {
      input.push(main(temp_input))
    }
  }
}

const closeEvent = () => {
  input.forEach((data,index) => {
    console.log(`${index + 1}. ${data}`)
  })

  process.exit();
}

rl.on('line', lineEvent)
  .on('close', closeEvent);

글을 남기며

위의 코드는 그냥 복붙해서 쓰면 된다.
다만 저게 왜 동작하는건지 궁금하다면 아래 글을 읽어보면 도움이 될듯 하다.

readline이란?

그냥 간단하게 소개하자면 입력을 한줄 단위로 받을 수 있는 모듈이다.

lineEvent란?

한줄 입력을 받았을 때 해당 이벤트가 실행된다.

closeEvent란?

rl.close()를 통해 수동적으로 실행할수도 있고, 입력이 모두 종료되었을 때 발생하는 이벤트다.

base code 해석

const readline = require('readline');

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

// main함수에 전달할 데이터 초기화
let data;

// 실제 실행할 함수
const main = (data) => {
  // 함수 작성
}

// line 이벤트 핸들러
const lineEvent = (line) => {
  // 입력을 받으면 파라미터에 string으로 들어오는데 이를 알맞게 조리해서 쓰면 된다.
}

// close 이벤트 핸들러
const closeEvent = () => {
  // 아래처럼 프로세스가 종료되었을 때 조리한 데이터를 실행 함수에 전달해서 실행해주면 된다.
  // 명시적으로 프로세스도 종료해줘야 한다.
  // 사실 안해봐서 프로세스 종료가 필수인지는 모르겠다만 쨌든 정상동작하니 해줘라
  console.log(main(data));
  process.exit();
}

// 이벤트 핸들러 바인딩
rl.on('line', lineEvent)
  .on('close', closeEvent);

다들 알고리즘 화이팅!

혹시나 더 필요한 케이스가 있으면 남겨주세요.

profile
프론트엔드 개발자

0개의 댓글