알고리즘/JavaScript

백준에서 javascript로 문제 푸는 법 총정리 (feat. 입력 받는 법)

홍구리당당 2023. 12. 5. 23:44

1. 백준에서 javascript로 문제 푸는 법

백준에선 javascript 언어를 지원하지 않는다. js로 풀려면 node.js를 선택해서 풀어야 한다.

빡침...

따라서 우리는 node.js를 선택해서 풀어야 한다. 그런데 node.js로 풀 때 문제가 있다. 어떻게 입력값을 받고 출력하는가?

입력에는 realine 혹은 fs 모듈을 쓰고, 출력에는 console.log() 메소드를 쓰자.

  1. readline 사용하기
// 1. 입력값이 한 줄에 한 개 뿐일 때 string 형 값을 가져온다.
const readline = require('readline').createInterface({
    input: process.stdin,
    output: process.stdout,
});
let input = [];
readline.on('line', function(line) {
  input.push(line);
}).on('close', function(){
  // solution(input);
    process.exit();
});

console.log(input); // ["1"]
// 2. 입력값이 한 줄에 여러 개일 때 배열에 string형 값들을 저장한다.
/* ex)
1 2 3
4 5 6
*/
const readline = require('readline').createInterface({
    input: process.stdin,
    output: process.stdout,
});
let input = [];
readline.on('line', function(line) {
  input.push(line.split(" "));
}).on('close', function(){
  // solution(input);
    process.exit();
});

console.log(input); // [["1", "2", "3"], ["4", "5", "6"]]

// 2-1. 만약 여러 개의 값이 있는 한 줄만을 받는다면 이렇게 된다!!!!
/* ex)
1 2 3
*/
const readline = require('readline').createInterface({
    input: process.stdin,
    output: process.stdout,
});
let input = [];
readline.on('line', function(line) {
  input.push(line.split(" "));
}).on('close', function(){
  // solution(input);
    process.exit();
});

console.log(input); // [["1", "2", "3"]] 즉, 원하는 값에 접근하려면 input[0][0, 1, 2] 이렇게 이차원 배열로 접근해야 함...
// 3. 입력값이 여러 줄일 때 string형 값들을 저장한다.
/* ex)
1
2
3
*/
const readline = require('readline').createInterface({
    input: process.stdin,
    output: process.stdout,
});
let input = [];
readline.on('line', function(line) {
  input.push(line);
}).on('close', function(){
  // solution(input);
    process.exit();
});

console.log(input); // ["1", "2", "3"]
// 4. 입력값이 첫 번째 줄에는 입력 값의 길이(n), 두 번째 줄에 공백으로 구분된 입력값이 주어질 때
/* ex)
3
1 2 3
*/
const readline = require('readline').createInterface({
    input: process.stdin,
    output: process.stdout,
});
let input = [];
readline.on('line', function(line) {
  input.push(line.split(" "));
}).on('close', function(){
  // solution(input);
    process.exit();
});

console.log(input); // [["3"], ["1", "2", "3"]]
// 5. 입력값이 첫 번째 줄에는 입력 값의 길이(n), n개의 줄에 걸쳐서 한 줄에 하나의 입력값이 주어질 때
/* ex)
3
1
2
3
*/
const readline = require('readline').createInterface({
    input: process.stdin,
    output: process.stdout,
});
let input = [];
readline.on('line', function(line) {
  input.push(line);
}).on('close', function(){
  // solution(input);
    process.exit();
});

console.log(input.slice[1]); // ["1", "2", "3"]

정리하자면, readline.on() 의 두 번째 인자로 오는 function에서 line은 문장 한 줄 자체를 말하는 것이다.

input.push(line)을 할 경우 배열에 각 line을 집어넣게 되니, 문장이 한 개든 두 개든 간에 무조건 1차원 배열이 튀어나온다.

그런데 한 줄에 여러 단어를 입력받으면서 line.split(" ")을 하게 되면, 각 문장이 또 1차원 배열로 쪼개진다는 것이다.

즉, input.push(line.split(" ")) 을 하면 input으로 2차원 배열이 튀어나온다.


  1. fs 모듈 사용하기

fs 모듈을 사용해서 백준의 예제 입력 파일.txt에 접근해 입력을 읽는 방식이지만, 몇몇 문제에서 런타임 에러가 발생하기도 한다.
내 로컬 환경에서 테스트할 때엔 readFileSync의 인자로 input text.txt 경로를 넣어주면 된다.

const fs = require('fs');
const input = fs.readFileSync("./test.txt").toString().trim() ... ... 
// 1. 입력값이 한 줄에 한 개 뿐일 때 string 형 값을 가져온다.
/* ex)
1
*/
const fs = require('fs');
const input = fs.readFileSync("/dev/stdin").toString().trim();
console.log(input) // '1'
// 2. 입력값이 한 줄에 여러 개일 때 배열에 string형 값들을 저장한다.
/* ex)
1 2 3
*/
const fs = require('fs');
const input = fs.readFileSync("/dev/stdin").toString().trim().split(" ");
console.log(input); // ['1', '2', '3']
// 3. 입력값이 여러 줄일 때 string형 값들을 저장한다.
/* ex)
1
2
3
*/
const fs = require('fs');
const input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");
console.log(input); // ['1', '2', '3']
// 4. 입력값이 첫 번째 줄에는 입력 값의 길이(n), 두 번째 줄에 공백으로 구분된 입력값이 주어질 때
/* ex)
3
1 2 3
*/
const fs = require('fs');
const [n, input] = fs.readFileSync("/dev/stdin").toString().trim().split("\n");
const inputArr = input.trim().split(" ")
console.log(input); // "1 2 3"
console.log(inputArr); // ["1", "2", "3"];
// 5. 입력값이 첫 번째 줄에는 입력 값의 길이(n), n개의 줄에 걸쳐서 한 줄에 하나의 입력값이 주어질 때
/* ex)
3
1
2
3
*/
const fs = require('fs');
const [n, ...input] = fs.readFileSync("/dev/stdin").toString().trim().split("\n");
console.log(input); // ["1", "2", "3"];

만약 숫자형 배열로 바꾸려 한다면 split 메소드 뒤에 .map(Number) 이라는 코드를 추가하면 된다.

미친 환경...

2. 프로그래머스에서 javascript로 문제 푸는 법

겁나 쉽다. 그냥 풀면 된다!!! 프로그래머스는 javascript 환경을 제공한다. (갓 프로그래머스...)

입력을 받을 필요도, 출력을 할 필요도 없다. 그냥 function 내부 로직만 구현해서 답을 return 하기만 하면 된다.

3. 결론

백준에서 풀 때엔

readline으로 입력 받을 경우 웬만하면 아래 코드로 다 된다.

const readline = require('readline').createInterface({ input: process.stdin, output: process.stdout, });
let input = []; 
readline.on('line', function(line) { 
  input.push(line.split(" ")); 
}).on('close', function(){ 
  // solution(input); process.exit(); 
});

fs로 입력 받을 경우엔 머리 좀 굴리면서 코드 짜자...

const fs = require('fs');
const input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");