자바스크립트로 백준풀기

손성호·2025년 3월 16일
2

'코테 준비를 자바스크립트로 하는 당신을 위해 준비했다!'
간단한 백준 세팅방법입니다.
사람마다 기초 세팅이 다르니, 저는 이렇게한다 정도로 참조하시면 좋을 것 같습니다.

기초틀

일단 자바스크립트로 백준 채점을 받으려면 '/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 혹은 코드조각구성을 쳐서 눌러줍니다.
VSCODE 파일 설정 이미지

코드조각 만들기 이미지

이렇게 뜰텐데요, 새 전역 코드 조각파일을 눌러줍니다.
파일이름은 아무거나 지어주시구요.

스니펫 예제 이미지

그러면 이런 파일이 열립니다.
여기서 Example부분의 주석을 해제하고, 원하는 내용을 넣으면됩니다.
수정할 부분은 prefixbody입니다.

  • prefix : 스니펫을 불러올 이름
  • body : 불러오는 스니펫 내용

백준 스니펫

저는 이렇게 설정을 해놓았습니다. 유의할 부분은 줄바꿈을 위해 큰따옴표로 해주셔야 됩니다.

유용한 메소드들

마지막으로 유용한 메소드들 소개하면서 마무리합니다.

  1. split
    return이 배열입니다. 주로 입력값 처리할 때 사용합니다.
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로 변환해서 받아옴.
  1. Array.from()
    2차원 배열 생성시 자주 사용
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 배열 생성
  1. Array.join()
    배열내의 값들을 하나의 문자열로 합침
    백준 N과M(12)
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());
  1. slice(begin,end)
    begin부터 end까지 값을 가지고 새로운 배열을 반환해주는 메소드입니다.
    splice()도 있는데 이 친구는 원본 배열이 수정될 수도 있어서 코테풀땐 잘 안쓰입니다.
    백준 좋다
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());
  1. Math관련
  • Math.max(a,b) : 제일 큰 값 반환
  • Math.min(a,b) : 제일 작은 값 반환
  • Math.abs(a) : 절대값 반환
  • ** : 제곱연산
let square = 2 ** 2 // 2^2 = 4
  • Math.floor(a) : 소수점이하로 버림 (이분탐색시 자주 사용)
let mid = Math.floor((A+B)/2);
  • Infinity : 제일 큰 값으로 설정 (주로 제일 작은 값 찾을 시, Infinity로 설정 후 Math.min()으로 갱신)

마무리

자바스크립트로 백준을 풀면 참 억까인 상황이 많이 걸립니다.
주로 type이 문제인데요, 나는 Number라고 생각했는데 문자열인 때가 종종있었습니다.
또, 나눗셈연산시에 소수점이 남아서 문제인 경우도 많습니다.
항상 타입 유의하시면서 푸십셔.
즐 알고리즘하세요~

profile
사용자를 위한 웹화면을 개발하고 있습니다.

0개의 댓글

관련 채용 정보