Meme's IT

[JS] 백준에서 fs 모듈로 input 받기(feat. VScode와 백준) 본문

FrontEnd/JavaScript

[JS] 백준에서 fs 모듈로 input 받기(feat. VScode와 백준)

Memez 2024. 6. 18. 17:17

백준에서 js(node.js)로 문제를 풀 때, 가장 먼저 생기는 문제...

input을 어떻게 받지...?

 

백준에서 알려준 예제에 따르면

require('fs')라는 코드를 이용해서 파일을 읽어오는 것 같은데, 얘네가 뭔지 한번 알아보고자 한다.


# fs 모듈?

fs 모듈은 node.js에서 파일의 입출력을 다룰 때 사용하는 모듈이다.

node js에서 파일을 다루는 함수들을 모아놓은 페이지에서 더 자세하고, 다양한 함수들을 확인할 수 있다.

 

let fs = require('fs');

다음과 같은 방법으로 가져오면 되고, 이때 let이나 const등은 상관없다.

 

그리고, 공식 페이지에서는 require('node:fs') 이런식으로 가져오는데, 이 차이는 Node.js 14.13.0 버전에서 도입된 네임스페이스 방식라고 한다. 'node: 네임스페이스'를 통해 Node.js 내장 모듈임을 더 명확히 알려줄 수 있다. 이를 통해 충돌을 방지하고, 사용자 정의 모듈이나 패키지와의 혼동을 줄일 수 있다고 한다.


~삽질기~

이제 해당 방법을 이용해서 VS code에서 테스트를 하면서 문제를 풀려고 했다.

우선, temp.js를 만들어서 코드를 작성하고

// temp.js
let fs = require('fs');
let input = fs.readFileSync('input.txt').toString().split('\n')
console.log(input)

temp.html을 만들어서 

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script src="./temp.js"></script>
</body>
</html>

브라우저에서 확인하려고 했는데,

require is not defined라고 한다. 

 

이제 이걸 위해서 추가한 것들을 보자면,

1. type='file'추가

우선, html파일에서 js파일을 가져올 때 script 태그로만 가져왔는데,

<script src="./temp.js"></script>

여기에 type='file'을 추가하는 방법이 가장 많이 나오길래 시도해봤다.

<script type="file" src="./temp.js"></script>

 

하지만, 날 반겨주는 건 비어있는 콘솔창...

아무것도없다.. 분명 console.log가 있었는데

 

2. input.txt 경로 설정!!!

당연히 안뜨는게 맞음.. 왜내면 경로 설정을 그대로 /dev/stdin으로 해놨기 때문에..

let input = fs.readFileSync('/dev/stdin').toString().split('\n')

이 부분을, input.txt파일을 만들고, 그 안에 input내용을 써서 저장한 후,

let input = fs.readFileSync('input.txt').toString().split('\n')

이렇게 바꿔줬다.

ㅎㅇ

하지만 여전히 날 반기는건 빈 콘솔창뿐...

 

안되는 이유는 애초에 require가 브라우저에서 쓸 수 없기 때문이다.

require은 node.js에서 사용되는 commonJS의 함수인데, 브라우저에서는 ES6 모듈 시스템이 사용된다고 한다.

 

3. 그럼 브라우저말고, node로 실행하자

처음에 브라우저로 했던 방식으로 배워서 그래서였나 당연히 js파일은 브라우저로 밖에 볼 수 없다고 생각했었는데, node를 이용하면 간단하게 터미널에서 실행 가능하다.

아까처럼 js파일을 다음과같이 만들고, 

let fs = require('fs');
let input = fs.readFileSync('input.txt').toString().split('\n')

console.log(input)

js 파일과 같은 위치에 input.txt파일을 만들어 준 후, 터미널에서

node temp.js

만 입력하면 간단하게 확인할 수 있었다.

 


그래서 결론은?

1. 백준에 제출할 때

➡️ 경로를 /dev/stdin으로 해서 제출하자

 

let fs = require('fs');
let input = fs.readFileSync('/dev/stdin').toString().split('\n')
console.log(input)

 

2. VS Code에서 풀 때

➡️ input.txt에 input값을 넣어주고, js파일에서 가져와서 쓰자

let fs = require('fs');
let input = fs.readFileSync('input.txt').toString().split('\n')
console.log(input)

그리고 결과는 터미널에서 node temp.js를 이용해서 확인하자!!!!

 

 

'FrontEnd > JavaScript' 카테고리의 다른 글

[JS] JS에서 배열 만들기(Array, Array.of, Array.from)  (0) 2024.06.11
[JS] JavaScript에서 import 써보기  (0) 2023.11.13
[JS] async와 await  (0) 2023.10.31
[JS] Node js에서 Promise 쓰기  (0) 2023.10.31
[JS] Axios  (0) 2023.10.30