Node.js 코딩 테스트 : 입력

RookieAND·2023년 2월 20일
2

CodingTest

목록 보기
3/3
post-thumbnail

📖 Before Start

이 글은 Node.js처음 코딩 테스트를 진행하는 분들께 유용합니다.

기껏 Python 으로 코딩 테스트 문제를 좀 푸나 싶었는데 이제는 프론트엔드 개발자를 희망하는 입장이 되어버린지라 Node.js, 즉 JS를 기반으로 문제를 풀어야 하는 상황에 봉착했다. 따라서 BOJ를 Node.js 기반으로 풀기 위한 입력 체계를 정리하고자 포스팅을 작성하였다.

✒️ Standard Input

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 에 받고, 이를 문자열로 치환한 후 끝에 있는 개행문자를 제거하는 식으로 입력 값을 가공한다.

✒️ BOJ vs Window

백준의 경우 리눅스 환경 을 기반으로 구동하기 때문에 /dev/stdin 으로 입력을 받을 수 있으나, window 환경에서는 별도의 txt 파일을 디렉토리에 생성하고 이를 읽도록 해야 한다.

따라서 필자는 process.platform 을 활용하여 현재 코드가 구동 중인 환경을 파악하고, 이에 따라 조건을 다르게 하여 입력을 받도록 하였다.

const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt"

const input = require("fs")
	.readFileSync(filePath)
	.toString()
	.trimEnd()

✒️ Example of Code

문제에서 요구하는 다양한 입력 방식에 따른 코드를 안내하는 파트다.

📌 N개의 정수를 한 줄로 입력 받았을 경우

const input = require("fs")
	.readFileSync("/dev/stdin") 
	.toString() 
	.trimEnd() 
	.split(" "); // 공백을 기준으로 값을 쪼개야 하기에 ' ' 사용

📌 N개의 정수를 한 줄로 입력 받아 List에 저장할 경우

const input = require("fs")
	.readFileSync("/dev/stdin") 
	.toString() 
	.trimEnd() 
	.split(" ") // 공백을 기준으로 값을 쪼개야 하기에 ' ' 사용
    .map(Number) // 내부의 문자열을 number 타입으로 변환시킴.

📌 N개의 정수를 여러 줄에 걸쳐 입력 받아 List에 저장할 경우

const input = require("fs")
	.readFileSync("/dev/stdin") 
	.toString() 
	.trimEnd() 
	.split("\n") // 여러 줄에 걸쳐 입력을 받았기에 \n 으로 쪼개야 함.
    .map(Number) // 내부의 문자열을 number 타입으로 변환시킴.

📌 N개의 문자열을 여러 줄에 걸쳐 입력 받아 List에 저장할 경우

const input = require("fs")
	.readFileSync("/dev/stdin") 
	.toString() 
	.trimEnd() 
	.split("\n") // 여러 줄에 걸쳐 입력을 받았기에 \n 으로 쪼개야 함.

📌 N개의 정수를 여러 줄에 걸쳐 입력 받아 이차원 배열에 저장할 경우.

const input = require("fs")
	.readFileSync("/dev/stdin") 
	.toString() 
	.trimEnd() 
	.split("\n") // 여러 줄에 걸쳐 입력을 받았기에 \n 으로 쪼개야 함.
    .map((row) => row.split(" ").map(Number)) // 공백으로 주어진 문자열을 쪼개어 배열 생성
profile
항상 왜 이걸 써야하는지가 궁금한 사람

0개의 댓글