🙋♂️Why?
최근에 코딩테스트를 본격적으로 풀고있다. 하루에 한 문제씩 팀원들과 풀기도 하고 별개로 풀기도 한다.
여러 풀이 사이트 중 가장 문제의 수가 많은 백준에서 문제를 풀고 있는데, 아쉽게도 백준에서 직접 문제풀이를 하기에는 어렵고 따로 로컬 PC에서 문제 이름에 해당하는 JS파일을 생성해서 코딩테스트를 풀이하고 있다. ex) B_1234.js
이때 내가 해야하는 프로세스는 다음과 같았다.
1. 문제를 탐색한다.
2. 탐색한 문제를 기반으로 로컬 파일을 만든다.
3. 파일을 만든 뒤, 기본 입출력을 입력 혹은 복붙한다.
4. 풀이를 진행한다.
크게 어렵거나 복잡함은 없었다. 약간의 귀찮음만 있었지,,,
그런데...
이제는 파일이 너무나도 많아지기 시작했다. 뭔가 묘수가 필요했다.
깃허브를 보면 10000번대 단위로 관리하는 경우도 많았는데 나의 경우에는 자동 업로드 익스텐션을 사용하고 있었기에 번호별 관리를 내가 직접할 필요성을 아직까지는 크게 느끼지 못하고 있었다.
나에게 있어서 문제는 파일을 만드는 것의 귀찮음 + 시간소요와 파일을 만들고 기본 템플릿을 입력하는 것의 귀찮음 + 시간소요였다. 그렇다면 현재 내가 해결해야 할 문제는 위 문제에서 발생한 2,3번 문제를 해결하는 것이였다.
2. 탐색한 문제를 기반으로 로컬 파일을 만든다.
3. 파일을 만든 뒤, 기본 입출력을 입력 혹은 복붙한다.
나는 해결책으로 파일 생성과 베이스 코드를 자동으로 제작해주는 자동화 스크립트를 만들기로 했다.
🛠️백준 JS Generator Code
다행히도 기존에 xml데이터를 json데이터로 변환하는 과정을 하며 node환경에서의 fs을 다뤄본 경험이 있다. 말은 거창하지만 별거 없다. JS가 다 해준다. 그래서 이번에도 그때의 경험을 살려 간단하게 제작했고 긴말없이 코드로 보도록 하자.
const fs = require("fs");
const path = require("path");
const { exec } = require("child_process");
const vscExecutor = (execFilePath, execFileName) => {
exec(`code ${execFilePath}`, (error, _, stderr) => {
if (error) {
console.error(`Visual Studio Code를 열던 중 오류가 발생했습니다: ${error}`);
return;
}
if (stderr) {
console.error(`stderr: ${stderr}`);
return;
}
console.log(`${execFileName}.js 파일이 Visual Studio Code에서 열렸습니다.`);
});
};
const createJSFile = (directory, fileName, content) => {
const filePath = path.join(directory, `${fileName}.js`);
// 파일이 이미 존재하는지 확인하고, 파일이 없는 경우에만 새 파일 생성
if (!fs.existsSync(filePath)) {
fs.writeFileSync(filePath, content);
console.log(`파일이 생성되었습니다. 파일 이름 : ${fileName}.js, 위치 : ${directory}`);
// 파일이 생성된 후에 Visual Studio Code에서 해당 파일을 연다.
vscExecutor(filePath, fileName);
} else {
console.log(`${directory} 위치에 ${fileName}.js 파일이 이미 존재합니다.`);
// 존재하는 파일도 열어준다.
vscExecutor(filePath, fileName);
}
};
// 아래 문자열 구역에 백준 링크를 입력한다.
// 아마 주로 뒷 숫자만 바꾸면서 사용하면 될 것 같다.
// ex) https://www.acmicpc.net/problem/1152
// ====================================================
const 백준링크 = "https://www.acmicpc.net/problem/10809";
// ====================================================
const directory = "./"; // 파일을 생성할 디렉토리
const fileName = "B_" + 백준링크.split("/").pop(); // 새 파일의 이름, ex)B_1152.js 이렇게 생긴다.
const content = `//${백준링크}\n
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "0_example.txt";
const splitPath = process.platform === "linux" ? "\\n" : "\\r\\n";
let input = fs.readFileSync(filePath).toString().trim().split(splitPath);`; // 파일에 들어갈 내용
createJSFile(directory, fileName, content);
require함수를 사용해 node 내장모듈에 있는 파일 시스템 fs모듈, 경로 정보 path모듈을 불러온다. 그리고 생성된 파일을 vsc로 실행시키기 위한 child_process 모듈도 불러온다.
`vscExecutor` 함수는 생성된 파일, 혹은 미리 존재하는 파일을 VSC에서 바로 열어주는 역할을 한다. 원래는 구현하지 않았는데 없으니까 불편해서 구현했다.
`createJSFile` 함수는 JS파일을 만드는 함수이다. 파일이 존재하는지 여부를 먼저 검사하여 존재한다면 파일을 바로 열어주도록 하고 파일이 없다면 새로운 파일을 만들어준다. 새로운 파일을 만들면, 바로 해당 파일을 열어준다.
파라미터로 디렉토리 위치, 파일 이름, 내부 콘텐츠를 받는다. 상수 형태로 외부에서 선언된 값들을 함수를 실행할 때 입력해준다. 이번 프로젝트가 `귀찮음` 때문에 시작되었으므로 맨날 바꾸는 것을 최소화 하기 위해서 백준 링크를 변수형태로 제작하여 해당 문자열을 기반으로 파일 이름과 내부 내용을 동적으로 가져가도록 기획하였다.
⭐결과물⭐
매우 깔끔하게 실행되는 것을 확인할 수 있다.
이제 코딩테스트 할때마다 매번 파일을 만들고 생성하는 과정을 거치지 않고 그냥 백준 번호만 입력하고 스크립트를 실행하면 된다.
code runner라는 extension을 사용한다면 더 편하겠지만 나는 터미널을 선호해서 터미널로 진행하고 있다.
맥북 환경에서도 역시나 잘 동작한다.
그럼 이제 더 간소화되었으니 코테를 열심히 풀러 가보도록 하자,,,
위에 코드가 있지만 약간의 개선된 점이나 업데이트 사항은 여기서 볼 수 있다. 일단 지금 떠오르는 것은 전체 URL 변경이 아닌 URL 마지막 문제 번호만 변수 형태로 바뀌는 개선점이 생각난다.
++ 24.05.20 trim()메서드 추가로 좌우 공백 제거 업데이트
'개발 > Javascript' 카테고리의 다른 글
GitHub README에 기술 블로그 최근 글 자동으로 업데이트 시키기 (1) | 2024.05.22 |
---|---|
자바스크립트 console.log()에 대한 고찰 (0) | 2024.05.18 |
JS를 이용해서 HTML 태그를 반복 출력해야하는 상황일 때 내장함수 map()을 이용해서 출력하는 법 (0) | 2023.10.17 |