서론
알고리즘 사이트는 여러가지가 있는데 프로그래머스 나 leetCode와 같은 사이트는 자동으로 입력을 처리해주고
함수내 알고리즘 코드만 작성하면 되는거라 입력받는 것에 대한 고민은 따로 안했었습니다.
근데 이번에 백준으로 알고리즘 풀어보면서 NODE.JS 기반이라 입력을 따로 처리 해줘야 해서 좀 번거로운 것 같단 생각을 했습니다. 익숙하지도 않고요 ㅜㅜ 그래서 백준에서 JS로 알고리즘 풀 때 입력처리를 어떻게 해야하는지 좀 알아보도록 하겠습니다.
readline 모듈 사용하기
우선 모듈은 readline 모듈을 사용하도록 하겠습니다. 여러가지 방법이 있던데, 이번시간에는 readline으로 알아보겠습니다.(근데 이 모듈이 런타임 에러를 발생시킬 수도 있다네요 확실히 엄청 느립니다 ㅜㅜ)
한줄 입력 받기
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
rl.on("line", function (line) {
console.log(line);
rl.close();
}).on("close", function () {
process.exit();
});
line 에 여러분이 입력한 문자들이 들어옵니다.
기본 형태로 한줄 입력을 받을 시에 사용합니다.
close는 입력을 멈출때 사용합니다.
공백을 기준으로 값 입력받는 방법
예시 ) 두개의 숫자를 공백을 기준으로 받아 더하여 출력하세요!
입력예시) 3 4 5 6 7
출력예시) [3,4,5,6,7]
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
let input = [];
rl.on("line", function (line) {
input = line.split(' ').map((el) => parseInt(el));
}).on("close", function () {
console.log(input);
process.exit();
});
받아온 line값을 공백으로 잘라 input에 저장했습니다.
근데 이상한 점을 발견하셨나요? close처리 하는 부분이 없습니다.
실제로 콘솔에서 실행하면 close 를 실행하는 부분이 없어서 계속 입력상태에 머무를 겁니다.
콘솔에서 실행할땐 코드내에서 조건을 넣어 CLOSE 처리해주어도 되고, control + c 로 종료시켜도 됩니다.
백준 사이트에서는 알고리즘을 테스트하기 위한 테스트 데이터들이 파일에 존재합니다.
콘솔에서 실행하면 키보드로부터 입력을 받기 때문에 계속해서 입력 이벤트를 대기하게 되지만,
파일을 받게 되는 경우에는 파일의 데이터가 끝이 나면 자동으로 EOF에 걸려 close되어 코드가 끝나기 때문에
따로 close 처리를 해줄 필요가 없습니다.
여러줄 입력받는 방법
입력 예시)
3
4
5
출력 ) [ '3', '4', '5' ]
이번에는 여러줄 입력 받는 방법을 알아보겠습니다. 배열에 push 하는 방식으로 하시면 됩니다.
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
const input = [];
rl.on("line", function (line) {
input.push(line);
}).on("close", function () {
console.log(input);
process.exit();
});
공백이 포함된 문자 여러줄 입력받는 방법
입력 예시)
3 4 5 6
6 7 8 9
1 2 3 4
출력예시)
[
[3,4,5,6],
[6,7,8,9],
[1,2,3,4],
]
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
const input = [];
rl.on("line", function (line) {
input.push(line.split(' ').map((v) => parseInt(v))));
}).on("close", function () {
console.log(input);
process.exit();
});
공백이 포함된 여러줄 받는 방법은 저렇게 이중 배열 형태로 출력이 됩니다.
알고리즘 풀때 팁
이렇게 입력을 직접 받는 문제가 나올경우 각 데이터를 변수에 담아 놓고 실제 알고리즘이 동작하는 부분은 함수로
빼서 푸시는게 훨씬 깔끔하게 푸실 수 있습니다.
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
// 더하기 함수
const sum = (x, y) => {
return x+y;
}
// 입력받은 데이터를 담을 변수
let input = [];
// 입력받는 부분
rl.on("line", function (line) {
input = line.split(' ').map((v) => parseInt(v));
}).on("close", function () {
console.log(sum(input[0],input[1]));
process.exit();
});
'알고리즘' 카테고리의 다른 글
[Codility] Lesson 4: Counting Elements - MaxCounters (javascript) (0) | 2021.03.18 |
---|