[Javascript로 정리하는 이코테] 0. JavaScript 입력받기 & 풀이 로직 분리
http://www.yes24.com/Product/Goods/91433923
개요
끝이 없는 알고리즘 지옥에서 빠져나오기 위해 구매한 책이다. 코테를 준비하고자 했다면 아마 모두가 알고 있는 책일 것이라고 생각한다. Python 기반에 Javascript의 코드는 고려되어 있지 않다는 것이 살짝 걸렸지만, 학부 시절 나동빈 님의 유튜브 강의를 보고 BFS/DFS를 이해했던지라 저자에 대한 기대로 읽기 시작했다.
진행 중이던 프로그래머스 풀이를 멈추고 한 달 동안 이 책에 몰입할 예정이며, 나오는 모든 풀이를 Javascript로 정리하려고 한다. 이번에는 제발 코딩테스트를 마스터하길..!
JavaScript 입력받기
C++과 달리, Javascript로 콘솔 입력을 받는 것은 굉장히 어색하다. 프로그래머스로 문제를 풀 때는 입력을 고려할 필요가 없었는데 백준과 같은 다른 곳에서 문제를 풀려고 하면 입력을 따로 받아야 한다.
입력 파일 가져오기 - readFileSync
fs
모듈을 활용한해 입력 파일 전체를 가져오는 코드이다.
const fs = require('fs');
let input = fs.readFileSync("/dev/stdin").toString().trim();
console.log(input);
이게 끝이면 좋겠지만, 이제 시작이다..😧 문제를 풀기 위해서는 이렇게 통으로 가져온 입력 값을 문제 상황에 맞춰 정제하는 과정이 별도로 필요하기 때문이다. 공백 혹은 줄 바꿈을 처리하고 입력 조건에 맞는 타입으로 변환해 필요한 변수에 담아 관리하는 과정이 필요하다. 예를 들어, 입력이 여러 줄로 들어오는 경우는 다음과 같다.
/* 입력 파일 형태
5 8 3
2 4 5 4 6
*/
const fs = require('fs');
const input = fs.readFileSync("/dev/stdin").toString().trim().split('\n'); //줄바꿈 처리 추가
let [nums, arr] = input;
console.log(nums, arr); //5 8 3 2 4 5 4 6
let [n, m, k] = nums.split(' ').map(value => +value); //공백 날리고 숫자로 변경
arr = arr.split(' ').map(value => +value);
console.log(n, m, k); //5 8 3
console.log(arr); //[2, 4, 5, 4, 6]
문제마다 들어오는 입력의 형태가 다르기 때문에 일단 전체를 받아와서 상황에 맞게 변경을 하면 된다. 처음에는 하나하나 변수를 처리하고 어느 정도 경험이 쌓이면 나만의 입력 템플릿을 만들 것이다.
참고) 통으로 입력 파일을 가져올 때, 런타임 에러가 발생하는 경우도 있다고 한다. 만약 런타임 에러가 나면 이 글의 코드를 참고하자. 해당 저자의 입력 템플릿을 볼 수 있다.
실시간 입력하기 - readline
콘솔에서 실시간 입력을 받고자 할 때는 readline
을 사용하면 된다. 다만, 이는 fs
모듈보다 느리기 때문에 웬만해서는 사용할 일이 없을 것 같지만 알아는 두자.
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();
});
문제 풀이 로직과 입력 정제를 분리하자
입력 값을 정제하는 과정이 다른 언어에 비해 복잡하기 때문에 입력과 풀이를 뒤죽박죽 적게 되면 헷갈릴 수 있다. 따라서 프로그래머스처럼 필요한 변수를 인자로 받고 결과를 반환하는 solution
함수를 만들어 풀이 로직만을 위한 공간을 마련해 두자.
템플릿
//입력 파일 전체 받아오기
const fs = require('fs');
let input = fs.readFileSync("./tc.txt").toString().trim();
//입력 정제하기
let [n, ...arr] = input;
//문제 풀이 로직
function solution(n, arr){
let ans = 0;
console.log(n, arr);
return ans;
}
solution(n, arr);