백준 또는 코드트리와 같은 사이트에서 알고리즘 문제를 풀 때는 입력값을 직접 받아 처리해야 합니다. 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();
});
'알고리즘 > 이론공부' 카테고리의 다른 글
연결 리스트 - 단일 연결 리스트 (0) | 2024.11.01 |
---|---|
배열(Array) - 배열의 연산과 동적 배열 (0) | 2024.10.29 |
공간복잡도 (Space Complexity) (0) | 2024.10.25 |
빅 오 표기법으로 표현하는 시간복잡도 (Time Complexity) (0) | 2024.10.24 |
점근적 표기법 (Asymptotic Notation) (0) | 2024.10.23 |