#0 개요

    C++로 코딩 테스트를 준비하고 있는데 놀랍게도 소프티어와 같이 웹 인력을 뽑는 코딩테스트 중에서는 java python js로만 코테 응시가 가능한 경우가 있었다.

    js 실력도 키울 겸, 이러한 코테를 공부할 겸, 또 문자열을 다루는데는 js가 편하기도 하니 c++로 풀던 알고리즘을 js로도 풀면서 여러가지를 정리해보려고 한다.

     

    #1 fs로 입출력하기

    const fs = require("fs");
    
    // 개행문자(\n)로 구분된 각 행을 요소로 가지는 배열을 반환. 
    // 인코딩을 명시적으로 넘기지 않은 경우에는 raw Buffer가 반환되므로 
    // toString()함수를 호출하여 string으로 변환하여야 한다.
    const input1 = fs.readFileSync(0).toString().split("\n");

    출처 - https://velog.io/@bigsaigon333/Javascript%EB%A1%9C-%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%A4%80%EB%B9%84%ED%95%98%EA%B8%B01-%EC%9E%85%EC%B6%9C%EB%A0%A5

     

    JavaScript로 코딩테스트 준비하기(1) - 입출력

    코딩테스트는 일반적으로 아래의 3단계로 구성됩니다. 입력: 주어진 입력을 받아들여 프로그램의 자료구조에 저장하기 계산: 알고리즘을 활용하여 정답을 계산하기 출력: 정답을 주어진 형식에

    velog.io

     

    해당 블로그를 보고 참고했다.

    인코딩을 명시적으로 넘기지 않을 경우 raw buffer가 반환된다는게 무슨 뜻인지 몰라 찾아보았다.

    string 형으로 타입을 변환하여 넣어주지 않으면 기본 타입인 raw buffer로 된다고 한다.

     

    공식 문서에서 buffer의 정의는 다음과 같다.

    Buffer objects are used to represent a fixed-length sequence of bytes. Many Node.js APIs support Buffers.

    The Buffer class is a subclass of JavaScript's Uint8Array class and extends it with methods that cover additional use cases. Node.js APIs accept plain Uint8Arrays wherever Buffers are supported as well.

     

    버퍼 객체는 고정된 길이의 바이트 시퀸스를 나타내는데 사용된다고 하는데, alloc이라는 메소드가 있고 크기를 할당해서 사용하는게, c++에서 저장 크기를 정하는 동적할당과 비슷한 느낌이었다.

    어찌되었던 저장 공간과 유사한 개념으로 이해했는데, toString으로 사용하지 않으면 input이 담긴 저장 공간을 통째로 반환한다는 것으로 이해했다.

     

    https://tesseractjh.tistory.com/39

     

    Node.js로 백준(BOJ) 문제 풀 때 유의할 점들

    백준에서 Node.js로 입력을 받는 방법은 크게 두 가지가 있다. 첫 번째는 readline 모듈을 사용하는 것이고, 두 번째는 fs 모듈을 사용하는 것이다. (이 글에서는 fs 모듈에 대해서만 다루겠다.) Python으

    tesseractjh.tistory.com

     

    위 블로그에서 input에 대해 아주 기깔나게 정리해두었다.

    글의 일부를 그대로 퍼오면 다음과 같다.

    // 1. 하나의 값을 입력받을 때
    const input = require('fs').readFileSync('/dev/stdin').toString().trim();
    
    // 2. 공백으로 구분된 한 줄의 값들을 입력받을 때
    const input = require('fs').readFileSync('/dev/stdin').toString().trim().split(' ');
    
    // 3. 여러 줄의 값들을 입력받을 때
    const input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');
    
    // 4. 첫 번째 줄에 자연수 n을 입력받고, 그 다음줄에 공백으로 구분된 n개의 값들을 입력받을 때
    const [n, ...arr] = require('fs').readFileSync('/dev/stdin').toString().trim().split(/\s/);
    
    // 5. 첫 번째 줄에 자연수 n을 입력받고, 그 다음줄부터 n개의 줄에 걸쳐 한 줄에 하나의 값을 입력받을 때
    const [n, ...arr] = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');
    
    // 6. 하나의 값 또는 공백으로 구분된 여러 값들을 여러 줄에 걸쳐 뒤죽박죽 섞여서 입력받을 때
    // ex) n 입력 - 공백으로 구분된 n개의 값 입력 - m 입력 - 여러 줄에 걸쳐 m개의 값 입력
    const input = require('fs').readFileSync('/dev/stdin').toString().trim().split(/\s/);
    const n = input[0];
    const n_arr = input.slice(1, n+1);
    const [m, ...m_arr] = input.slice(n+1);
    
    // 2~6에서 입력받는 값들을 모두 String에서 Number로 바꾸려면 split()뒤에 .map(Number)를 추가

     

    .trim()은 문자열의 양쪽 끝의 공백을 지워주는 역할을 한다.

    "1\n2\n"

    위와 같은 자료가

    ["1","2",""]

    위와 같이 저장되는 것을 방지한다.

     

    + 첫번째 input을 무시하는 두가지 방법

    1. ...으로 쪼개기

    const [num, ...array] = fs.readFileSync('./input.txt').toString().trim().split('\n');

     

    2. Array.shift() 사용하기

    첫번째 인자를 제외한 배열을 반환하는 메소드이다.

     

    #2 모든 인코딩

    1. string to int

    Number() 함수 사용

     

     

    #3 Array 관련 모든 것

    1. Array.map()

    인자로 callback함수를 받아서, 배열의 인자마다 for문을 반복해주는 것과 같음.

    callback 함수에 인자가 하나인 경우 배열의 요소가 그 인자로 들어가고

    두번째 인자가 있는 경우 index가 그 인자로 들어가게 된다.

     

    2. Array.join()

    모든 배열의 요소를 하나로 합친 string을 반환한다. 매개변수에 아무것도 넣지 않으면 요소 사이에 ',' 가, 무언가를 넣으면 그게 들어간다.

    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기