이 글은 Node.js 로 처음 코딩 테스트를 진행하는 분들께 유용합니다.
기껏 Python 으로 코딩 테스트 문제를 좀 푸나 싶었는데 이제는 프론트엔드 개발자를 희망하는 입장이 되어버린지라 Node.js, 즉 JS를 기반으로 문제를 풀어야 하는 상황에 봉착했다. 따라서 BOJ를 Node.js 기반으로 풀기 위한 입력 체계를 정리하고자 포스팅을 작성하였다.
readline 보다는 fs 라이브러리에서 제공하는 readFileSync() 를 사용하자.
백준 15552번 문제인 빠른 A+B 문제에서는 처음으로 빠른 입출력 방식을 요구한다.
https://www.acmicpc.net/problem/15552 에서 해당 문제의 전문을 열람할 수 있다.
const input = require("fs")
.readFileSync("/dev/stdin") // Buffer 객체 생성
.toString() // 이를 문자열로 치환
.trimEnd() // 문자열 끝의 개행문자 제거
.split("\n"); // 여러 줄의 값을 입력 받았을 경우 '\n'
Python 에서는 input()
대신 sys 라이브러리의 sys.stdin.readline()
을 권장하듯이, Node.js 에서도 Buffer를 사용하여 동작이 빠른 fs
모듈을 사용한다.
사용자의 입력을 Buffer
에 받고, 이를 문자열로 치환한 후 끝에 있는 개행문자를 제거하는 식으로 입력 값을 가공한다.
백준의 경우 리눅스 환경 을 기반으로 구동하기 때문에 /dev/stdin
으로 입력을 받을 수 있으나, window 환경에서는 별도의 txt
파일을 디렉토리에 생성하고 이를 읽도록 해야 한다.
따라서 필자는 process.platform
을 활용하여 현재 코드가 구동 중인 환경을 파악하고, 이에 따라 조건을 다르게 하여 입력을 받도록 하였다.
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt"
const input = require("fs")
.readFileSync(filePath)
.toString()
.trimEnd()
문제에서 요구하는 다양한 입력 방식에 따른 코드를 안내하는 파트다.
const input = require("fs")
.readFileSync("/dev/stdin")
.toString()
.trimEnd()
.split(" "); // 공백을 기준으로 값을 쪼개야 하기에 ' ' 사용
const input = require("fs")
.readFileSync("/dev/stdin")
.toString()
.trimEnd()
.split(" ") // 공백을 기준으로 값을 쪼개야 하기에 ' ' 사용
.map(Number) // 내부의 문자열을 number 타입으로 변환시킴.
const input = require("fs")
.readFileSync("/dev/stdin")
.toString()
.trimEnd()
.split("\n") // 여러 줄에 걸쳐 입력을 받았기에 \n 으로 쪼개야 함.
.map(Number) // 내부의 문자열을 number 타입으로 변환시킴.
const input = require("fs")
.readFileSync("/dev/stdin")
.toString()
.trimEnd()
.split("\n") // 여러 줄에 걸쳐 입력을 받았기에 \n 으로 쪼개야 함.
const input = require("fs")
.readFileSync("/dev/stdin")
.toString()
.trimEnd()
.split("\n") // 여러 줄에 걸쳐 입력을 받았기에 \n 으로 쪼개야 함.
.map((row) => row.split(" ").map(Number)) // 공백으로 주어진 문자열을 쪼개어 배열 생성