백준 자바스크립트(Node.js)를 쉽게 입력하는 방법을 탐구하다
코딩테스트 연습을 하려면 백준에서 문제를 푸는 것은 필수 코스이다
만은
백준은 프로그래머스처럼 자바스크립트 자체 지원이 안된다.
자바스크립트를 쓰고 싶으면 node.js를 선택해야 하는데,
아마 백준에서 node.js를 쓰려면 굉장히 복잡한 과정을 거쳐야 하기에 포기한 사람들이 많을 것이라 생각된다.
물론 나도 그랬고
,.,.,..,
여튼 최근 node.js를 사용하는 방법을 깨달아서, 어려움을 겪는 사람이 있다면 참고해 보자.
1. 입력 템플릿
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
// 1. 여기에 전역으로 쓰일 변수를 선언한다
rl.on('line', (line) => {
// 2. 여기는 입력을 line으로 받는 부분
}).on('close', () => {
// 3. 여기는 코드를 적는 부분
process.exit(0);
});
node.js 공식 사이트의 "Tiny CLI" 예시를 참고했다.
readline울 불러와서 rl로 인터페이스를 생성하고 어쩌구,..,,.,.
복잡한 과정은 제끼고 본론만 알아보자.
1. 전역으로 쓰일 변수를 선언하는 곳
이 부분에 변수를 선언하고, 코드 작성부에서 변수를 변경하는 방식으로 문제를 해결 할 수 있다.
원시 자료형의 경우 const로 지정 하면 변경이 안되기 때문에 보통 let으로 설정하는게 좋다.
물론 참조 자료형은 변수를 재할당 하지 않는 이상 const를 써도 무방.
2. 입력을 line으로 받는 부분
흔히 예시에 나오는 '입력'을 받는 부분이다.
입력이 한 줄인 경우와 여러 줄인 경우로 나눌 수 있는데,
한 줄인 경우엔 바로 line 변수를 이용해 문제를 해결 할 수도 있다.
문제는 입력이 여러줄인 경우.
이때는 1번 구간에 배열 또는 객체를 생성해서 입력을 하나하나 push해 줘야 한다
입력이 여러줄일 때는 line에 한번에 들어오는게 아니라
한 줄씩 line에 할당되어 들어오기 때문에, line을 배열에 push하면 각 줄의 입력이 배열로 들어오게 된다
//예시
//입력
//'3'
//'1,2'
//'3,4'
//'5,6'
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
const input = [];
rl.on("line", (line) => {
input.push(line);
}).on("close", () => {
console.log(input);
process.exit(0);
});
//결과
// ['3', '1,2', '3,4', '5,6']
이런 식으로 말이다.
물론 입력이 한줄이라도 1번 구역에 설정한 전역변수에 line을 할당해서 풀어도 무방하다
과정이 한단계 늘어날 뿐!
3. 코드를 작성하는 부분
1번 구역에서 전역변수를 선언하고, 2번 구역에서 입력을 받았다면, 3번 구역에서는 문제를 풀면 된다.
참고로 백준의 정답은 return이 아니라 console.log로 받으므로, 불필요한 console문은 모두 지워줘야 한다.
요약!!
1번 구역에 전역 변수 선언
2번 구역에서 전역 변수에 입력값 할당
3번 구역에서 전역변수를 이용해 문제 풀이
예시) 입력이 한줄인 경우
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
//전역변수 let 선언
let len = 0;
rl.on("line", (line) => {
//입력을 len에 할당
len = Number(line);
}).on("close", () => {
let stick = 64;
let ans = 0;
const queue = [stick];
let sum = 0;
while (stick > 1) {
stick /= 2;
queue.push(stick);
}
for (let num of queue) {
if (sum === len) {
break;
}
if (sum + num > len) {
continue;
} else {
sum += num;
ans++;
}
}
console.log(ans);
process.exit(0);
});
예시) 입력이 여러 줄인 경우
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
//전역변수 input 배열 선언
const input = [];
rl.on("line", (line) => {
//입력을 input에 push
input.push(line);
}).on("close", () => {
const n = input.shift();
const divs = input[0].split(" ").map(Number);
console.log(Math.max(...divs) * Math.min(...divs));
process.exit(0);
});
혹시 더 좋은 방법이 있다면 알려주시면 감사하겠습니다,.,.,.,.,.,.
모두 코테 준비 열심히 하시길!