백준, 코드트리 환경에서 JavaScript로 문제 풀기 (JS 입력 받기)

백준 또는 코드트리와 같은 사이트에서 알고리즘 문제를 풀 때는 입력값을 직접 받아 처리해야 합니다. Javascript로는 어떻게 콘솔 입력을 받아 문제를 풀 수 있는지 알아봅시다.

 

💻 백준 언어 설정

 

백준에서 자바스크립트로 알고리즘 문제를 풀기 위해서는 위와 같이 언어 > node.js로 설정해주어야 합니다. (코드트리에는 Javascript 선택지가 있습니다)

 

 

💻 fs 모듈 활용하기

 

자바스크립트에서는 입력을 받기 위해 node.js의 fs(file system) 모듈을 불러와서 readFileSync라는 메서드를 사용하게 되는데요, 파일 내의 데이터를 문자열로 변환하여 변수(input)에 저장하는 방식으로 사용합니다. 이 때, 문자열 끝의 불필요한 공백 등을 없애기 위해 trim() 함수를 함께 사용합니다. 

 

 

➡️ 입력값 경로 설정하기

 

백준, 코드트리 환경에서는 경로가 "/dev/stdin"이지만, 로컬 환경인 vsCode에서 실행을 해볼 경우 input 값을 넣을 텍스트 파일이 따로 있어야 합니다. 입력 텍스트 파일의 이름을 "input.txt" 이라고 가정해보겠습니다.

const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split(" ");

위와 같이 작성하는 경우, 백준 또는 코드트리에서는 "/dev/stdin"경로로, 다른 환경에서는 input.txt 파일에서 입력값을 받아올 수 있습니다. 

 

 

💠 입력 방법에 따른 예제

 

✅ 한줄로 입력

//한줄 입력
/*
3 5 11 92
*/
const fs = require("fs");
let input = fs.readFileSync("/dev/stdin").toString().trim().split(" ");

 

 

✅ 여러줄로 입력

//여러 줄 입력
/*
15
21
60
*/
const fs = require("fs");
let input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");

 

 

✅ 다양한 값이 입력될 때

//n줄에 각각 m개씩의 데이터 입력
/*
3
2 11 20
4 55 71 96 82
3 21 37 40
*/
const fs = require("fs");
let input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");
const n = +input[0];
const inputTestCase = [];

for(let i=1; i<=n; i++) {
    const arr = input[i].split(" ").map((item) => +item);
    
    let newArr = [];
    for(let j=1; j<arr.length; j++){
    	newArr.push(arr[j]);
    }
    const testCase = {
    	N: arr[0],
        arr: newArr,
    }
    inputTestCase.push(testCase);
}

 

 

✅ 최종 템플릿

const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");
const n = +input[0];
const inputTestCase = [];

for(let i=1; i<=n; i++) {
    const arr = input[i].split(" ").map((item) => +item);
    
    let newArr = [];
    for(let j=1; j<arr.length; j++){
    	newArr.push(arr[j]);
    }
    const testCase = {
    	N: arr[0],
        arr: newArr,
    }
    inputTestCase.push(testCase);
}

solution(n, inputTestCase);

function solution(n, inputTestCase) {
    /*
    	문제 풀이 부분
    */
    console.log("정답 출력");
}

최종적으로 위와 같이 문제 풀이 부분이 들어가는 solution 함수를 정의하여 깔끔하게 사용할 수 있습니다.

 

 

💻 readline 활용하기

다른 방법으로 아래와 같이 readline을 사용할수도 있지만, 코드가 복잡해 주로 fs모듈을 사용한다고 합니다.

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

let input = [];

readline.on("line", function(line){
    //입력 값 처리 부분
    
    rl.close();
}).on("close", function(){
	/*
    	코드 작성 부분
    */
    process.exit();
});