본문 바로가기

언어/javascript

코딩테스트 자주사용하는 코드 (JavaScript)

반응형

https://redbinalgorithm.tistory.com/579

 

코딩테스트 자주사용하는 코드 (JAVA)

여러 코딩테스트를 하다보면 VS Code, 이클립스같은 IDE를 사용하지 못하는 코딩테스트가 있다. 또한 요즘 코로나로 퍼지면서 실시간 녹화와 원격으로 감시하기 때문에 검색을 하거나, IDE의 자동

redbinalgorithm.tistory.com

이전에 JAVA로 자주 사용하는 코딩테스트 형식을 공유했다. 이제는 JS로 어떻게 사용할지에 대한 문의를 쓸려고 한다.

 

Sort 함수

var arr = [1,3,4,5,6];
arr.sort();

 

class 사용법 function으로 대체가능

class Car {
    constructor(type, year) {
        this.type = type;
        this.year = year;
    }
}

function Car2(type, year) {
    this.type = type;
    this.year = year;
}

const c = new Car('test',2015);
let list = [];
list.push(new Car('Volvo',2016));
list.push(new Car2('moning',2020));
/*
[
  Car { type: 'Volvo', year: 2016 },
  Car2 { type: 'moning', year: 2020 }
*/

 

class 객체들 sort 방법

var cars = [
    { type: 'Volvo', year: 2016 },
    { type: 'Saab', year: 2001 },
    { type: 'BMW', year: 2010 },
];

var ret = cars.sort(function (a, b){
    return a.year - b.year;
})

Queue

라이브러리는 없는 배열자체에 push와 shift로 비슷한 효과를 낼 수 있음(코테언어는 아닌듯..)

class Queue {
    constructor() {
        this._arr = [];
    }
    
    push(value) {
        this._arr.push(value);
    }
    
    pop() {
        this._arr.shift();
    }

    isEmpty() {
        return this_arr.length === 0;
    }
}

const queue = new Queue();

///////성능 문제로 이슈있을 경우 아래와같은 원형 큐 로 변경합니다.


class node {
    constructor(val) {
        this.value = val;
        this.next = null;
    }

    setNext(n) {
        this.next = n;
    }
}

class Queue {
    constructor() {
        this.head = null;
        this.tail = null;
        this._size = 0;
    }

    push(node) {
        if (this.head == null) {
            this.head = node;
        } else {
            this.tail.next = node;
        }
        this._size++;
        this.tail = node;
    }

    pop() {
        if (this.head == null) return -1;

        let returnNode = this.head;
        if (this.head != this.tail) this.head = this.head.next;
        else {
            this.head = null;
            this.tail = null;
        }
        this._size--;
        return returnNode;
    }
    
    size() {
        return this._size;
    }
}

Heap (근데 js에서는 라이브러리로 Heap을 제공하지않느다.. 혹시나 나온다면 출제자 대가리를 깨자!)

혹시나 라이브러리가 가능하다면?? 다음과 같은 'heap-js'를 사용하고 없다면... 다음코드를 복붙해서 사용하자.

진짜 풀어야한다면.... 구글에서 복붙해서 쓰고 만약 구현을 해야하는데 참조가 안된다면 배열을 사용해서 삽입,삭제를 공부해서 구현해야할 것..

 

 

// Basic usage example
import Heap from 'heap-js';

const minHeap = new Heap();
const maxHeap = new Heap(Heap.maxComparator);

minHeap.init([5, 18, 1]);
minHeap.push(2);
console.log(minHeap.peek()); //> 1
console.log(minHeap.pop()); //> 1
console.log(minHeap.peek()); //> 2

// Iterator
maxHeap.init([3, 4, 1, 12, 8]);
for (const value of maxHeap) {
  console.log('Next top value is', value);
}


/////// 라이브러리 안되면 직접 구현

const top = 0;
const parent = i => ((i + 1) >>> 1) - 1;
const left = i => (i << 1) + 1;
const right = i => (i + 1) << 1;

class PriorityQueue {
  constructor(comparator = (a, b) => a > b) {
    this._heap = [];
    this._comparator = comparator;
  }
  size() {
    return this._heap.length;
  }
  isEmpty() {
    return this.size() == 0;
  }
  peek() {
    return this._heap[top];
  }
  push(...values) {
    values.forEach(value => {
      this._heap.push(value);
      this._siftUp();
    });
    return this.size();
  }
  pop() {
    const poppedValue = this.peek();
    const bottom = this.size() - 1;
    if (bottom > top) {
      this._swap(top, bottom);
    }
    this._heap.pop();
    this._siftDown();
    return poppedValue;
  }
  replace(value) {
    const replacedValue = this.peek();
    this._heap[top] = value;
    this._siftDown();
    return replacedValue;
  }
  _greater(i, j) {
    return this._comparator(this._heap[i], this._heap[j]);
  }
  _swap(i, j) {
    [this._heap[i], this._heap[j]] = [this._heap[j], this._heap[i]];
  }
  _siftUp() {
    let node = this.size() - 1;
    while (node > top && this._greater(node, parent(node))) {
      this._swap(node, parent(node));
      node = parent(node);
    }
  }
  _siftDown() {
    let node = top;
    while (
      (left(node) < this.size() && this._greater(left(node), node)) ||
      (right(node) < this.size() && this._greater(right(node), node))
    ) {
      let maxChild = (right(node) < this.size() && this._greater(right(node), left(node))) ? right(node) : left(node);
      this._swap(node, maxChild);
      node = maxChild;
    }
  }
}

//

{const top=0,parent=c=>(c+1>>>1)-1,left=c=>(c<<1)+1,right=c=>c+1<<1;class PriorityQueue{constructor(c=(d,e)=>d>e){this._heap=[],this._comparator=c}size(){return this._heap.length}isEmpty(){return 0==this.size()}peek(){return this._heap[top]}push(...c){return c.forEach(d=>{this._heap.push(d),this._siftUp()}),this.size()}pop(){const c=this.peek(),d=this.size()-1;return d>top&&this._swap(top,d),this._heap.pop(),this._siftDown(),c}replace(c){const d=this.peek();return this._heap[top]=c,this._siftDown(),d}_greater(c,d){return this._comparator(this._heap[c],this._heap[d])}_swap(c,d){[this._heap[c],this._heap[d]]=[this._heap[d],this._heap[c]]}_siftUp(){for(let c=this.size()-1;c>top&&this._greater(c,parent(c));)this._swap(c,parent(c)),c=parent(c)}_siftDown(){for(let d,c=top;left(c)<this.size()&&this._greater(left(c),c)||right(c)<this.size()&&this._greater(right(c),c);)d=right(c)<this.size()&&this._greater(right(c),left(c))?right(c):left(c),this._swap(c,d),c=d}}window.PriorityQueue=PriorityQueue}

// Default comparison semantics
const queue = new PriorityQueue();
queue.push(10, 20, 30, 40, 50);
console.log('Top:', queue.peek()); //=> 50
console.log('Size:', queue.size()); //=> 5
console.log('Contents:');
while (!queue.isEmpty()) {
  console.log(queue.pop()); //=> 40, 30, 20, 10
}

// Pairwise comparison semantics
const pairwiseQueue = new PriorityQueue((a, b) => a[1] > b[1]);
pairwiseQueue.push(['low', 0], ['medium', 5], ['high', 10]);
console.log('\nContents:');
while (!pairwiseQueue.isEmpty()) {
  console.log(pairwiseQueue.pop()[0]); //=> 'high', 'medium', 'low'
}

 

MAP

기본적으로 다음사이트를 참고했다. ( 자주쓰는것만 간추리면..)

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Map

 

Map - JavaScript | MDN

Map 객체는 키-값 쌍을 저장하며 각 쌍의 삽입 순서도 기억하는 콜렉션입니다.

developer.mozilla.org

 

let myMap = new Map()

let keyString = '문자열'
let keyObj    = {}
let keyFunc   = function() {}

// 값 설정
myMap.set(keyString, "'문자열'과 관련된 값")
myMap.set(keyObj, 'keyObj와 관련된 값')
myMap.set(keyFunc, 'keyFunc와 관련된 값')

myMap.size              // 3

// getting the values
myMap.get(keyString)    // "'문자열'과 관련된 값"
myMap.get(keyObj)       // "keyObj와 관련된 값"
myMap.get(keyFunc)      // "keyFunc와 관련된 값"

myMap.get('문자열')    // "'문자열'과 관련된 값"
                         // keyString === '문자열'이기 때문
myMap.get({})            // undefined, keyObj !== {}
myMap.get(function() {}) // undefined, keyFunc !== function () {}

NAN을 사용해서 현재 이값이 들어있는지 탐사가능..

if(hash.get("value")=="not a number")

 

let myMap = new Map()
myMap.set(NaN, 'not a number')

myMap.get(NaN)
// "not a number"

let otherNaN = Number('foo')
myMap.get(otherNaN)
// "not a number"

순환 방법

let myMap = new Map()
myMap.set(0, 'zero')
myMap.set(1, 'one')

for (let [key, value] of myMap) {
  console.log(key + ' = ' + value)
}
// 0 = zero
// 1 = one

for (let key of myMap.keys()) {
  console.log(key)
}
// 0
// 1

for (let value of myMap.values()) {
  console.log(value)
}
// zero
// one

for (let [key, value] of myMap.entries()) {
  console.log(key + ' = ' + value)
}
// 0 = zero
// 1 = one

split

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/split

 

String.prototype.split() - JavaScript | MDN

split() 메서드는 String 객체를 지정한 구분자를 이용하여 여러 개의 문자열로 나눕니다.

developer.mozilla.org

str.split([separator[, limit]])

문자열 반대로 출력

const reversed = array1.reverse();

substring

console.log(str.substring(1, 3));
// expected output: "oz"

console.log(str.substring(2));
// expected output: "zilla"

2차원 ArrayList를 만들고 싶을 때 (즉 동적으로 바뀌는 3차워 배열을 만들고 싶을 때 사용하는 방법)

function create2DArray(rows, columns) {
    var arr = new Array(rows);
    for (var i = 0; i < rows; i++) {
        arr[i] = new Array(columns);
        for(var j =0; j<columns; j++){
            arr[i][j] = [];
        }
    }
    return arr;
}

// arr[5][2]
var arr = create2DArray(10, 10);

 

Array 선언 후 초기화

/* Array.from()으로 길이가 5, 값이 0인 배열 생성하기 */
const arr = Array.from({length: 5}, () => 0);
console.log(arr); // => Array(5) [0, 0, 0, 0, 0]
console.log(arr[0]); // => 0
console.log(arr.length); // => 5

// 다른 방법
var Edge = Array(n + 1).fill().map(_ => []);

2차원 배열 max값 하는 방법

    digit.forEach((item)=> {
        console.log(item);
        answer = Math.max.apply(null, item);
    })
반응형