반응형
https://redbinalgorithm.tistory.com/579
이전에 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
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
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);
})
반응형
'언어 > javascript' 카테고리의 다른 글
javascript: 프로토타입 체이닝 (0) | 2021.07.20 |
---|---|
바인딩 되지 않는 this (0) | 2021.06.28 |
javascript : 단어 벽 부딪히기 효과 (0) | 2020.12.17 |
javascript : 회전시키기 (2) | 2020.12.17 |
javascript : 스타일 속성 이름 차이점 (0) | 2020.12.17 |