'코테 준비를 자바스크립트로 하는 당신을 위해 준비했다!'
간단한 백준 세팅방법입니다.
사람마다 기초 세팅이 다르니, 저는 이렇게한다 정도로 참조하시면 좋을 것 같습니다.
일단 자바스크립트로 백준 채점을 받으려면 '/dev/stdin' 경로의 파일을 읽어야 합니다.
백준 서버내의 파일을 읽는 식으로 채점이 이루어집니다.
그래서 fs모듈을 require하고 위에서 언급한 경로의 파일을 readFileSync메소드로 입력값을 읽어오면 됩니다.
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "test.txt";
const input = fs.readFileSync(filePath).toString().trim().split("\n");
function solution() {
}
console.log(solution());
저는 예제 입력값을 테스트하기위해 test.txt파일을 만들어서 값을 넣어보고 있습니다.
백준서버가 리눅스여서, 리눅스환경이라면 백준서버의 파일을 읽고 아니라면 내 현재 디렉토리의 test.txt파일을 읽도록 경로를 설정하였습니다.
또한 저는 코드가독성과 일관화된 패턴을 주기 위해 solution 함수라는걸 만들어 알고리즘을 작성하고 있습니다.
문자열 관련 문제들을 풀 때는, 출력을 많이 해야하는 경우가 있습니다. 이럴땐 ans 변수라는 걸 만들어서 모든 문자열을 저장하고 return ans로 console.log함수를 한번만 사용하도록 합니다. 콘솔로그가 은근 cost가 커서 가끔씩 터질 때가 있습니다. 문자열은 한번에 처리하시길
let ans = "";
function solution() {
for(let i = 0; i < 10000; i++) {
ans += arr[i];
}
return ans;
}
console.log(ans);
일일히 기초틀 치기 귀찮잖아요? 그래서 저는 아예 스니펫으로 만들어놨습니다.
baekjoon으로 설정해놨어요.
스니펫 설정은 다음과 같습니다.
MAC os기준으로 cmd + shift + p 키를 누릅니다. (윈도우는 아마 커맨드 대신 윈도우 키일거같아요)
그럼 검색창이 뜰텐데, snippet 혹은 코드조각구성을 쳐서 눌러줍니다.
이렇게 뜰텐데요, 새 전역 코드 조각파일을 눌러줍니다.
파일이름은 아무거나 지어주시구요.
그러면 이런 파일이 열립니다.
여기서 Example부분의 주석을 해제하고, 원하는 내용을 넣으면됩니다.
수정할 부분은 prefix와 body입니다.
저는 이렇게 설정을 해놓았습니다. 유의할 부분은 줄바꿈을 위해 큰따옴표로 해주셔야 됩니다.
마지막으로 유용한 메소드들 소개하면서 마무리합니다.
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "test.txt";
const input = fs.readFileSync(filePath).toString().trim().split("\n");
const [N, S] = input.shift().split(" "); // 첫번째 줄을 공백을 기준으로 자른다.
const [N, S] = input.shift().split(" ").map(Number); // 응용버전. N과 S를 Number로 변환해서 받아옴.
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "test.txt";
const input = fs.readFileSync(filePath).toString().trim().split("\n");
const N = +input.shift(); // 첫번째 값을 받아와서 +로 Number로 캐스팅
let arr = Array.from({length : N}, () => Array(N).fill(0));
//0으로 이루어진 N x N 배열 생성
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "test.txt";
const input = fs.readFileSync(filePath).toString().trim().split("\n");
let [N, M] = input.shift().split(" ").map(Number);
let arr = input.shift().split(" ").sort((a, b) => a - b);
arr = [...new Set(arr)]; // 중복제거
N = arr.length;
let temp = [];
let ans = "";
function recursive(num, depth) {
if (depth === M) {
ans += temp.join(" ") + "\n"; //배열내 값을 하나의 문자열로 합침
return;
}
for (let i = num; i < N; i++) {
temp.push(arr[i]);
recursive(i, depth + 1);
temp.pop();
}
}
function solution() {
recursive(0, 0);
return ans;
}
console.log(solution());
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "test.txt";
const input = fs.readFileSync(filePath).toString().trim().split("\n");
const N = +input.shift();
let arr = input.shift().split(" ").map(Number);
let ans = 0;
function binarySearch(findNum) {
const list = [...arr.slice(0, findNum), ...arr.slice(findNum + 1)];
// 기존 배열을 가지고 새로운 구간 배열을 만들어 이분탐색
let [left, right] = [0, N - 1];
while (left < right) {
const mid = list[left] + list[right];
if (mid === arr[findNum]) {
return 1;
}
if (arr[findNum] > mid) {
left++;
} else {
right--;
}
}
return 0;
}
function solution() {
arr.sort((a, b) => a - b);
for (let i = 0; i < N; i++) {
ans += binarySearch(i);
}
return ans;
}
console.log(solution());
let square = 2 ** 2 // 2^2 = 4
let mid = Math.floor((A+B)/2);
자바스크립트로 백준을 풀면 참 억까인 상황이 많이 걸립니다.
주로 type이 문제인데요, 나는 Number라고 생각했는데 문자열인 때가 종종있었습니다.
또, 나눗셈연산시에 소수점이 남아서 문제인 경우도 많습니다.
항상 타입 유의하시면서 푸십셔.
즐 알고리즘하세요~