본문 바로가기

FrontEnd/PS through Javascript

자바스크립트에서 값 입력받기

참고: https://www.youtube.com/watch?v=myDEDaaOd30&t=854s

참고: https://velog.io/@bomida/JS-%EC%BD%94%EB%94%A9-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%A4%80%EB%B9%84-%EA%B0%92-%EC%9E%85%EB%A0%A5-%EB%B0%9B%EA%B8%B0

코테에서 자바스크립트 사용시 값 입력받기. 

백준에서 Node.js로 입력값을 받기 위해선 readline 모듈 또는 fs 모듈을 사용하면 된다. 이 둘 중 fs모듈이 더 빠르므로 fs를 사용하도록 한다. 단, 문제를 풀다보면 fs로는 컴파일 에러가 나는 경우가 있다. 그럴땐 readline을 사용해야 한다.



fs는 FileSystem의 약자로 파일 처리를 하는 모듈로, 직접 입력 파일을 읽어와서 처리한다.


1. 하나의 값을 입력받을 때
const input=fs.readFileSync('/dev/stdin').toString();

//2. 공백으로 구분된 한 줄의 값들을 입력받을 때
const input=fs.readFileSync('/dev/stdin').toString().split(' ');

//3. 여러 줄의 값들을 입력받을 때
const input=fs.readFileSync('/dev/stdin').toString().split('\n');

- toString( )을 쓰는 이유


문자열을 입력 받는다면 toString()을 안붙여도 될 것 같지만, fs.readFileSync('/dev/stdin')의 반환값은 Buffer 객체이다. fs.readFileSync('/dev/stdin', 'utf8')와 같이 인수로 인코딩을 지정해주지 않으면 Buffer 객체가 반환됨

따라서 문자열로 바꿔주지 않으면 예상치 못한 오류가 날 수 있다.

참고. 만약 trim()을 써주어야 한다면 split()이전에 써주면 된다. 

==========================================================================================

아래는 입력이 어느정도 복잡한 백준 문제이다. 이 문제에서 입력을 받는 코드는 아래와 같다.

평균은 넘겠지 4344 https://www.acmicpc.net/problem/4344

const fs=require('fs');

let input=fs.readFileSync('./input.txt').toString().split("\n");
console.log("practice makes perfect")
let T=+input[0]
for(let i=1;i<=T;++i){
    let arr=input[i].split(" ").map(item=>+item)
    let length=arr[0]
    let nArray=[]
    for(let j=1;j<=length;++j){
        nArray.push(arr[j])
    }
    // const data={
    //     length:length,
    //     array:nArray
    // }
    // console.log(data)
    solution(length, nArray)
}

function solution(len, array){
    console.log("length"+len+" ");
    console.log("Array="+array);
}

=========================================================================================

아래는 참고글

값 입력 받는 방법

1. 값을 입력 받기 위해서는 먼저 node.js의 file system 모듈을 불러옵니다.

const fs = require(`fs`);

2. fs 모듈의 readFileSync 함수를 통해 동기적으로 해당 경로의 파일 전체를 읽어들입니다.

  • 백준에서는 '/dev/stdin' 경로에 테스트 케이스 파일이 있습니다.
  • 읽어드린 정보는 toString() 함수를 통해 문자열로 변환하여야 사용할 수 있습니다.
  • 입력 받은 문자열을 split() 함수를 통해 배열화 합니다.
    이 때, 공백을 기준으로 문자를 나누어 값을 저장합니다.(split(' '), split('\n') 등)
  • 예) 2 3 입력 시, inputData = ['2', '3'];
const inputData1 = fs.readFileSync('/dev/stdin').toString().split(' ');

3. options으로 인코딩을 string 자료형으로 넘기는 경우, toString을 할 필요없이 문자열 반환

const inputDataStr = fs.readFileSync(0, 'utf8').split(' ');

4. 문자열을 숫자로 바꿔서 넘길 때
배열.map(value => +value) 이것과 같이 +를 붙여주면 숫자가 된다.

const inputDataNum = fs.readFileSync('/dev/stdin').toString().split(' ').map(value=>+value);

5. 여러 줄로 입력받을 때

const inputDataStr = fs.readFileSync('/dev/stdin').toString().split('\n');

실전 적용

백준 javascript 1000번 문제를 풀어보겠습니다.

Solution

const fs = require('fs');
const inputData = fs.readFileSync('/dev/stdin').toString().split(' ').map(value=>+value);

const [a, b] = inputData;

console.log(A+B);

 

마지막으로 언급하고 싶은것은 개인적으롤 연습을 할때에는 readFileSync의 매개변수를 './파일이름' 으로 하면 되지만 백준에 제출할때에는 '/dev/stdin' 으로 해야 한다는 것이다.

아래는 내가 백준에 제출한 코드

const fs=require('fs');//fs=file system
let input=fs.readFileSync('/dev/stdin').toString().split(' ').map(item=>+item);
let a=input[0];
let b=input[1];
console.log(solution(a,b));

function solution(a, b){
    return a+b
}

'FrontEnd > PS through Javascript' 카테고리의 다른 글

백준(BOJ) 1463: 1로 만들기  (1) 2024.02.03
백준(BOJ) 2798: 블랙잭  (1) 2024.02.01
백준(BOJ) 2920: 음계  (0) 2024.01.22
백준(BOJ) 4344: 평균은 넘겠지  (0) 2024.01.22
기초문법 with Algorithm (ing)  (0) 2024.01.20