백준에서 nodeJS 사용하기 (#01): 입력과 출력 - #10950번

Kyle Lee·2021년 9월 18일
1
post-thumbnail

1. 서론

많은 사람들이 코딩테스트를 준비하거나 알고리즘 문제해결을 위해 백준이라는 사이트를 애용합니다. 백준에서는 다양하고 폭넓게 언어를 제공하여 문제를 풀 수 있도록 하지만, 그 중 JS는 그 명성과 다양한 활용성에 비해 백준에서는 상당히 비인기 언어에 속합니다.

그 이유는 백준에서 nodeJS를 사용함에 있어서 편의성이 매우 떨어지기 때문입니다. 이는 아마 자바스크립트 특유의 자유로운 문법, 복잡한 입력방식, 예측하기 어려운 오류 때문이라고 생각됩니다. 따라서 대다수의 JS 개발자들은 JS로 코딩테스트를 풀기 위해 해외 코딩테스트 사이트를 이용하거나 프로그래머스라는 국내 사이트를 주로 사용하곤 합니다.

그럼에도 불구하고 nodeJS로 백준 문제들을 풀어보는 것은 상당히 유용하다고 생각됩니다. 백준은 국내에서 가장 많고 다양한 문제들을 가지고 있고, JS 개발자들은 선택의 폭이 턱없이 좁기 때문에 항상 알고리즘 문제풀이에 목말라 있기 때문이죠.

앞으로 단계별로 풀어보기를 통해 백준에서의 nodeJS 사용법을 알아보고 JS로 다양한 알고리즘을 해결해보겠습니다.

2. 출력

nodeJS로 출력은 단순히 console.log()를 사용하면 됩니다.

console.log("Hello World!);
//"Hello World!"

3. 입력

반면 백준에서 nodeJS로 입력값을 받는 것은 상당히 까다로운데요

개발자들의 친구 Python에서는 그냥 input() 함수를 통해 전달받으면 되지만 nodeJS에서는 초심자에게 다소 어지러운 형태로 입력을 받아야합니다...

const fs = require('fs');
//파일 시스템 모듈을 임포트합니다.
const input = fs.readFileSync('/dev/stdin');
//백준의 입력값을 readSync 함수를 통해 파일의 입력값을 받아옵니다.
//이때 입력값을 비동기적으로 받는다면 순서가 엉킬 수 있으니 동기적으로(Sync) 받아와야 합니다.

이렇게 우리는 nodeJS의 fs.readFileSync() 함수를 통해 입력값을 받아올 수 있습니다.
다만 파일의 위치 '/dev/stdin'은 백준 사이트의 고정값이니 로컬환경에서 실행하실 때는 자신의 입력 파일 위치를 확인하시길 바랍니다.

하지만 이게 끝이 아닙니다. 우리는 입력값을 선제적으로 우리의 목적에 따라 사용할 데이터 형태로 가공해야합니다.

4. 입력값 가공

//위 코드 이어서..

const charArray = input.toString().split('');
//만약 입력값이 한 단어이고 각 철자를 배열로 받아야할 경우

const wordArray = input.toString().split(' ');
//만약 입력값이 한 줄의 여러 단어이고 각 단어를 배열로 받아야할 경우

const numArray = input.toString().split(' ').map(Number);
//만약 입력값이 한 줄의 여러 숫자이고 각 수를 배열로 받아야할 경우

JS의 String.split() 함수를 활용해 입력값을 배열 형태로 받아오는 방법들입니다. 또한 split() 매서드는 배열을 리턴하기 때문에 이후 JS의 다양한 Array.prototype 매서드를 활용해 입력값을 가공할 수 있습니다.


해당 문제'한 줄에 띄어쓰기로 구별된 2개의 정수'를 입력값으로 받아옵니다.

const input = require('fs').readFileSync('/dev/stdin').toString().split(' ').map(Number);
//무지막지한 JS의 체이닝을 통해 한 줄로 입력값 받아오기
//[1, 2]

이제 input은 두개의 숫자 요소를 가진 배열이 되었습니다.
따라서 우리는 input[0] + input[1]을 리턴해서 정답을 구할 수 있습니다

const input = require('fs').readFileSync('/dev/stdin').toString().split(' ').map(Number);

console.log(input[0] + input[1]);

5. 마치며

사실 백준에서 nodeJS 입력값을 받아오는 방법은 어느정도 정형화되어 있습니다.
국룰처럼 사용되는 코드를 어떤 데이터 형식으로 할지에 따라 조금씩 달라지기만 할 뿐이죠.

//국룰 코드
const input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n').map(Number);
//여러줄로 이루어진 숫자를 배열로 받아야할 경우
//백준의 입력값들 중 개행문자가 포함되어 있는 경우가 있기 때문에 반드시
//trim() 함수를 통해 개행문자를 제거해야한다.

첫번째 글을 마치며 위 국룰 입력 코드를 활용한 문제풀이로 복습하며 마무리 하도록 하겠습니다.

* 10950번 문제

//국룰 입력 코드
const input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');

//전체 테스트 케이스 개수 : T
const testCase = input.shift();

//shift() 함수를 통해 첫번재 요소(T)를 pop시켰기 때문에 
//input은 이제 띄어쓰기로 구별된 각 숫자들이 한 줄씩 "String" 형태로 저장되어 있다.
// ex) input : ["1 1", "2 3", "3 4", "9 8", "5 2"]

input.forEach(a => {
  //[destructuring]을 통해 A와 B에 각 정수 할당
  const [A, B] = a.split(' ').map(Number);
  
  //출력
  console.log(A + B);
})

참고 : shift() 함수 , JS Destructuring 자료

profile
필요에 의한 개발

0개의 댓글