본문 바로가기
자료구조 알고리즘/코딩테스트 풀이

백준 1330번 문제, node.js로 제출하기...

by 쿠리의일상 2023. 1. 31.

C++이나, C#로 백준은 풀어봤지만 자바스크립트로는 처음이라 헤맸다.

어떻게 입력을 받을지 고민하다가 설마 prompt로 받아주나? 했지만 ...ㅋㅋㅋ 이건 아니었고

그것도 그렇고 백준에는 자바스크립트가 아예 없었다.. 충격

node.js로 해주면 된다고해서 그렇게 설정해주고, 입력 받는 방법은 도저히 감도 안잡혀서 구글링을 했다.

첫 시작부터 험난하구만 그래~!

 

자바스크립트로 백준문제 풀기. node.js를 활용하려면?

 

1. 텍스트 파일 형태로 주어지므로 fs 모듈로 받아야 한다. -> 하지만 런타임 에러로.. 권장하진 않는다고 한다 

readFileSync() 해주되, /dev/stdin 에 fs 모듈이 있다고 한다 ... 이건 암기해야함.

 

1. 입력값이 한 개일 때 (한줄)

const fs = require('fs');
const input = fs.readFileSync("/dev/stdin").toString().trim();
 
 
줄임 : const input = require('fs').readFileSync("/dev/stdin").toString().trim();

2. 입력값이 여러 개 일때 (한줄에 공백으로 구분)

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

3. 입력값이 여러 줄 일때

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

4. 입력값이 첫 번째 줄에는 입력 값의 길이(n), 두 번째 줄에 공백으로 구분된 입력값이 주어질 때

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

5. 입력값이 첫번째 줄에는 입력 값의 길이(n), n개의 줄에 걸쳐서 한 줄에 하나의 입력값이 주어질 때

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

 

✚ VSCode에서 input.txt 로, 백준 같은 리눅스 환경에선 /dev/stdin 으로 받아오는 방법

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

 

2. readline 이용하기

파일 시스템에 비해 복잡

readline 모듈을 가져오는 것은 동일하나 close가 있는 .on()에서 함수를 작성해줘야 한다고 함... ???

const readline = require('readline').createInterface({

  input : process.stdin,

  output : process.stdout,

});

 

let input = [ ];

readline.on('line', function(line) {

  input = line.split(' ').map(e1 => parseInt(e1));

}).on('close', function() {

  // 여기에 솔루션 코드 작성하거나 만들어준 함수를 넣어줘서 활용

  // ex) func(input); ...

  process.exit(); // 끝낼 때 마지막에 작성

});

 

 

사실 문제 자체는 절대 어려운 게 아니었고 ... 처음이라 어색해서 그랬음. 입력 받기 정리하려고 블로그에 끄적였다.

그래서 VSCode 로 자바스크립트 문제를 어떻게 푸는지?

1. node.js가 설치되어 있어야 함 + VSCode 확장프로그램 code runner 도 필요

2. input.txt(파일명은 자유) 파일을 따로 만들어준다... (벌써부터 귀찮고 다른 언어로 풀 때가 편했음을 직감한다..) 만든 파일은 js 파일과 같은 위치에 두자.

즉, const input = require("fs").readFileSync("./input.txt").toString().trim(); 으로 입력값을 받아올 수 있는 것임

3. 받아온 입력 값을 바로 사용해줄 수 없으므로... 문제에 맞게 형변환이 필요하다.

split() 이든, parseInt() 같은 메서드를 활용하여 입력값을 정제하고 형변환해준다.

4. 그리고 입력값을 받아줄 함수를 선언.. 풀면 됨 (ctrl+option+N으로 실행 가능)

 

5. 마지막으로 백준에 정답을 제출하기 전 readFileSync("/dev/stdin") 으로 변경해줘야 함

근데 이 방법은 위에 소개한 경로를 지정해주는 const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt"; 요걸로 해주면 해결될 듯하다?

 

 

입력값만 받는건데 어렵다... 쉬운 문제로 좀 익숙해질 필요가 있을 듯

그리고 다른 언어에 비해 엄~~~~청 오래걸린다. C#도 런타임 시간 엄청 긴 편이었는데... 더 긴 듯..

 

// 입력 받아오는 fs 모듈
const fs = require('fs');
const inputs = fs.readFileSync("/dev/stdin").toString().trim().split(" ");

// 입력 받아온 값을 변수에 캐싱
let num1 = Number(inputs[0]);
let num2 = Number(inputs[1]);

// 함수 표현식으로 원하는 기능 구현
var result = function(a, b) {
  if(a > b)
    console.log(">");
  else if (a < b)
    console.log("<");
  else if (a === b)
    console.log("==");
};

// 함수 호출
result(num1, num2);