.
js로 코딩테스트를 칠 일이 생겨 급하게 입출력을 공부했다.
조금 복잡하기 때문에 따로 정리해두고 나중에 또 확인하면 좋을 것 같아서 글을 쓴다.
자바스크립트로 입력을 받는 방식엔 크게 두가지의 케이스가 있다고 볼 수 있다.
첫째, 파일로 받기
둘째, 콘솔로 직접 입력받기
이번 게시글에서는 콘솔로 입력받기를 정리할 예정이다.
콘솔로 입력받기란? 흔히 vs code같은 ide에서 bash창을 통해 직접 입력값을 넣어주는 케이스를 말한다.
방법
1. 기본 골격
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
let num = 0;
let numArr = [];
rl.on('line', (line) => {
num = line;
rl.close();
}).on('close', () => {
numArr.push(num);
console.log(numArr);
});
js는 입력을 받기 위해 객체를 생성해주어야 한다. 그 객체가 rl이며 readline 모듈을 가져와 creatInterface 메소드로 생성한다.
위 코드는 rl이라는 객체를 통해 'line'이라는 입력 이벤트를 받으면 받은 입력값을 num에 저장해주고, 입력이 끝날 경우(close 이벤트) numArr에 num을 넣어주는 코드이다.
입력값: 2
결과값: ['2']
'2'를 2로 바꾸고 싶다면 parseInt 함수를 사용하면 된다.
2. 입력값이 공백을 기준으로 띄어쓰기 되어있을 때 (ex: 3 5)
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
let num = 0;
let num2 = 0;
let numArr = [];
rl.on('line', (line) => {
[num, num2] = line.split(' ').map(Number); // parseInt를 사용하면 NaN 뜨는 경우가 있음. map 사용할 시 Number 사용하자
rl.close();
}).on('close', () => {
numArr.push(num);
numArr.push(num2)
console.log(numArr);
});
입력값은 2 3 이라고 할 때, 위의 코드는 다음과 같이 동작한다.
입력 이벤트를 들으면('line' 이벤트) 받은 입력값(line)을 split을 활용해 ' '(공백)을 기준으로 나누어준다. 그 나눈 요소별로 map을 활용해 map 내부의 함수(Number)를 하나씩 적용하여 리스트로 만들어준다.
결과적으로 [num, num2] = [2, 3]
의 형태가 되며, num에 2, num2에 3의 값이 대응되게 된다.
3. 첫 줄과 두번째 줄의 입력 모양이 다를 때
이 케이스가 코테에 가장 많이 사용되는 케이스이다. 가령 첫 줄에 n과 m을 주고, 이후 n개의 줄에 m개의 요소가 입력되는 등의 경우가 그렇다.
3 5
1 2 3 4 5
2 5 7 6 8
3 5 6 7 2
이런 입력값이 있다고 하자. n과 m은 각각 3과 5이고, 첫 줄 이후 n개의 줄에 m개의 요소가 공백을 기준으로 입력되고 있는 상황이다.
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
let input = []; // 전체 입력값을 넣어줄 리스트 생성
let numArr = [];
rl.on('line', (line) => {
if (line == '') {
rl.close();
};
input.push(line);
}).on('close', () => {
const [n, m] = input[0].split(' ').map(Number);
for (let i = 1; i <= n; i++) {
numArr.push(input[i].split(' ').map(Number));
};
console.log(n)
console.log(m)
console.log(input)
console.log(numArr)
});
다시 한 번 말하지만, 'line' 이벤트의 경우 한 줄씩 받는 것이다.
line을 계속 입력받다가 공백이 주어지면 입력을 멈추기 위해 rl.close() 코드를 작성하였다.
전반적인 개념은 다음과 같다. 먼저 줄 단위로 입력을 받으며 input 리스트에 값을 넣어준다.
input[0]의 값이 n과 m의 값이기 때문에, split과 map을 활용하여 분리 후 정수로 전환해준다.
input[1]부터 input[n]까지의 값이 m개의 요소를 가진 입력값이므로 요소별 순회하며 split과 map을 적용해준다.
실행 결과는 다음과 같다.
조금 방식을 바꿔 n개의 줄이 입력되면 자동으로 입력이 멈추게 작성해보도록 하겠다.
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
let input = []; // 전체 입력값을 넣어줄 리스트 생성
let numArr = [];
let lineCount = 0;
rl.on('line', (line) => {
input.push(line);
lineCount++;
if (lineCount === 1) {
// 첫 번째 줄에서 n과 m을 추출
[n, m] = line.split(' ').map(Number);
} else if (lineCount === n + 1) {
// 필요한 줄 수를 모두 입력받은 경우 입력 종료
rl.close();
}
}).on('close', () => {
for (let i = 1; i <= n; i++) {
numArr.push(input[i].split(' ').map(Number));
};
console.log(n)
console.log(m)
console.log(input)
console.log(numArr)
});
실행 결과는 다음과 같다.
자바스크립트를 활용한 bfs 구현 (0) | 2024.07.07 |
---|---|
백준 12851: 숨바꼭질 2 (BFS 활용) (0) | 2024.06.25 |
위상정렬 알고리즘 (0) | 2024.03.03 |
LCA (최소 공통 조상) 알고리즘 (2) | 2024.02.29 |
백준 15311 약팔기, 19568 직사각형 (0) | 2024.02.27 |
댓글 영역