개발 기초/언어

[JavaScript] 입력 받기

숩니따 2024. 6. 30. 22:57

입력 방법

`fs` 모듈

파일 시스템과 상호작용할 수 있게 해주기 때문에 테스트 케이스가 파일로 존재할 때 사용한다.

`fs.reqdFileSync('/dev/stdin').toString()`을 통해 문자열을 읽고 split를 통해 문자열을 괄호 안의 기준으로 끊어 input 배열로 반환한다.

장점:

  1. 단순성: readFileSync를 사용하여 동기적으로 전체 입력을 한 번에 읽어올 수 있어 코드가 간결
  2. 속도: 한 번에 입력을 읽어와서 처리하므로 작은 입력의 경우 빠르게 처리
  3. 간편성: 설정 없이 바로 사용할 수 있어 초보자에게 친숙

단점:

  1. 메모리 사용량: 입력이 매우 큰 경우, 한 번에 메모리에 올리므로 메모리 사용량이 많음
  2. 비동기 처리 불가능: 동기적으로 처리되므로 비동기적으로 입력을 받아야 하는 상황에서는 부적합

한 글자 입력

12345
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().trim(); // 문자열, 숫자 입력
// 문자열
// String 12345
console.log('String', input)
// 숫자
// Number: 12345
const num = Number(input);
console.log('Number:', num);

공백 있는 여러 글자 입력

1 2 3 4 5
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().trim(); // 문자열, 숫자 입력

// 문자열 배열
// String Array: 1 2 3 4 5
console.log('String Array:', input);
// 숫자 배열
// Number Array: [1, 2, 3, 4, 5]
const numArray = input.map(Number);
console.log('Number Array:', numArray);

여러 줄 입력

example string
1 2 3
4 5 6
7 8 9
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().split('\n');

const str = input[0]
const nums = []

for (let i = 1; i < input.length; i++) {
	if (input[i] !== '') {
		nums.push(input[i].split(' '));
	}
}

// String: example string
console.log('String:', str);  
// Number Array: [ [ '1', '2', '3' ], [ '4', '5', '6' ], [ '7', '8', '9' ] ]
console.log('Number Array:', nums);

첫 줄 N 다음 줄 공백 구분 여러 값 입력

3
1 2 3
4 5 6
const fs = require('fs');
// /\s/는 문자열을 공백(스페이스, 탭, 새 줄 등) 문자(white space)로 구분하는 데 사용
// 연속된 공백(하나 이상의 공백)을 처리하려면 /\s+/를 사용
const [n, ...arr] = fs.readFileSync("/dev/stdin").toString().trim().split(/\s+/);

// 3
console.log(n)
// ['1', '2', '3', '4', '5', '6']
console.log(arr)

첫 줄 N 다음 줄 여러 개 걸쳐 한 줄에 하나의 값 입력

3
1
2
3
4
5
6
const fs = require('fs');
const [n, ...arr] = fs.readFileSync("/dev/stdin").toString().trim().split("\n");

// 3
console.log(n)
// ['1', '2', '3', '4', '5', '6']
console.log(arr)

2차원 배열 입력

3 3
1 2 3
4 5 6
7 8 9
const fs = require('fs');

const input = fs.readFileSync('/dev/stdin').toString().trim().split('\n');
const [rows, cols] = input[0].split(' ').map(Number);

// 첫 번째 이후 줄 각 줄 공백 분할하고 숫자로 변경
const array2D = input.slice(1, rows + 1).map(line => line.split(' ').map(Number));
// 2D Array: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ]
console.log('2D Array:', array2D);

`readline` 모듈

장점:

  1. 동기적 처리: readline은 이벤트 기반으로 한 줄씩 처리할 수 있어, 대화형 입력이나 라인 단위로 입력을 받을 때 유용
  2. 메모리 효율성: 입력이 매우 큰 경우, 한 줄씩 처리함으로써 메모리를 효율적으로 사용
  3. 유연성: 여러 종류의 입력을 대화형으로 처리

단점:

  1. 복잡도: 설정과 이벤트 핸들링이 필요하여 코드가 다소 복잡해짐
  2. 비동기적 처리: 비동기적으로 작동하므로, 모든 입력을 받은 후 처리할 때는 추가적인 코드가 필요

한 글자 입력

5
const readline = require('readline');

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

rl.question('Enter input: ', (answer) => {
  console.log('String:', answer);  // String: 5

  const num = Number(answer);
  console.log('Number:', num);  // Number: 5

  rl.close();
});

여러 줄 입력

1
2
3
4
5
const readline = require('readline');

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

let input = [];

rl.on('line', (line) => {
  input.push(line);
});

rl.on('close', () => {
  console.log('String Array:', input);  // String Array: [ '1', '2', '3', '4', '5' ]

  const numArray = input.map(Number);
  console.log('Number Array:', numArray);  // Number Array: [ 1, 2, 3, 4, 5 ]
});

공백 있는 여러 글자 입력

1 2 3 4 5
const readline = require('readline');

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

rl.question('Enter elements separated by space: ', (answer) => {
  const numArray = answer.split(' ').map(Number);
  console.log('Number Array:', numArray);  // Number Array: [ 1, 2, 3, 4, 5 ]

  rl.close();
});

2차원 배열 입력

3 3
1 2 3
4 5 6
7 8 9
const readline = require('readline');

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

let input = [];

rl.on('line', (line) => {
  input.push(line);
});

rl.on('close', () => {
  const [rows, cols] = input[0].split(' ').map(Number);
  const array2D = input.slice(1, rows + 1).map(line => line.split(' ').map(Number));
  // 2D Array: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ]
  console.log('2D Array:', array2D);
});

'개발 기초 > 언어' 카테고리의 다른 글

[JavaScript] 잘못된 변수 키워드는 이상한 결과가 되  (0) 2024.07.14
[JavaScript] 힙 자료구조  (1) 2024.06.30
[Java] 변수와 자료형  (0) 2024.06.30
[Java] 입출력  (0) 2024.06.30
[Java] 코드 구조  (0) 2024.06.30