본문 바로가기

분류 전체보기

(251)
[완전탐색] 소수 찾기 완전 탐색을 하기 위해서 케이스를 배열에 담고 splice를 이용하여서 재귀하는 방식을 이용하였다. 첫번째 인자에는 남은 케이스를 두번째 인자에는 현재 타겟을 이용하였고, 남은 케이스의 길이를 반복하였다. 중복을 체크하기 위해서 Set을 이용하였는데, has와 add 메소드를 파악해두자. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 function solution(numbers) { var answer = 0; var numberArray = numbers.split(''); var checkNumber = new Set() recursion(numberArray,''); fun..
[탐욕법] 체육복, 구명보트 탐욕법(Greedy) 어떤 문제를 접했는데 당연히 DP로 해결하는 문제라고 생각했다. 다만 조건이 꽤 다양한 편이라서 성가신 문제라고 생각했는데, 효율성에서 완전 엉망이 됬다. 탐욕법은 DP와 같이 다양한 케이스중 최적해를 찾을 때 사용되는 알고리즘이다. 그리고 이는 DP보다 빠르다. 체육복 굉장히 어려운 문제는 아니다만, DP로 오해하면 한 없이 복잡해진다. 최적의 경우, 최대한 많이, 그리고 많은 조건을 키워드로 탐욕법이라는 것을 유추해야 한다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #include #include using namespace std; int student[35]; int solution(int n, vector lost..
Puppeteer.js 를 이용한 웹 자동화 https://github.com/GoogleChrome/puppeteer Puppeteer Puppeteer는 node.js를 이용하여 웹 자동화를 도와주는 API이다. 정말 간단한 사용법에 비해, 엄청나게 파워풀한 기능들을 가지고 있다. 사용 브라우저의 경우 Chrome 시리즈인 Chromium를 이용해서 사용한다. 그렇기 때문에 서버에서 사용시에 굉장히 많은 메모리 소모가 되기 때문에, 여러 사람이 사용하기에는 적합한지는 생각해보아야 할 문제다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 const puppeteer = require("puppeteer"); const doPuppeteer = async() => { const browser = await puppeteer.la..
Parse & Crawling To Node.js (노드로 파싱 및 크롤링하기) 파싱과 크롤링 전에 알아야 할 지식들을 순서대로 알아보자. 1. fs module node.js 자체 모듈이다. 파일 io를 위해서 사용되고 있다. 사용법 fs.readFile(filename, [options], callback) 외부의 파일을 읽을 때 사용된다. 이 때, callback 함수를 사용 할 경우 해당 메소드는 비동기적으로 작용하여 callback을 완료시킨다. 이 외에는 동기적으로 작동한다. 이 때 읽어들인 파일은 버퍼형태로 리턴되기 때문에 toString으로 인코딩 해주어야 한다. const parser = require("csv-parse/lib/sync"); const fs = require("fs"); const csv = fs.readFileSync("csv/data.csv");..
[DP] N으로 표현, 타일 장식물, 정수 삼각형 N으로 표현 계속해서 추적해야 하는 값이 수의 케이스이기 때문에 배열을 리턴한다. d[n] = n개를 사용하여 만든 수의 모음 d[n] 은 d[n-i] + d[i] ( 이 때, i는 1부터 n-1) 까지 이 때 중복된 값은 딱히 제거하지 않아도 상관없으나, 말 그대로 중복해서 계산하기 때문에 중복을 무시하기 위해 set을 이용한다. 마지막으로 목적하는 값이 있다면 해당 인덱스를 리턴한다. 아닌 경우에는 -1을 리턴한다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 #include #include #include using namespace std; int N; unorder..
Javascript로 Hash 처리하기 c++이나 자바 파이썬의 map, Hashmap, dictionary과 같이 Hash처리하기 위해 마땅히 좋은 방법이 없는거 같다. 아니면 내가 모르는 거겠지... 오랜만에 한 번 사용해봤는데 너무 미숙해서 정리를 하고자 한다. 1 var a = [1,2,3,1,2,2,2,3,1,4,6]; // 실험 배열 해당 배열을 중복 처리, 객체 정렬등을 해보도록 한다. 중복값의 누적 다른 언어를 사용하다가 자바스크립트를 사용할 때 가장 헷갈리는 부분이다. 자바스크립트는 객체의 키를 배열처럼 접근 할 수 있다. 1 2 3 4 5 6 7 obj = {} obj[1] = 1; obj // { 1: 1} obj[1] = ++obj[1]; obj // { 1: 2} obj[2] = 1; obj // { 1: 2, 2 : ..
비동기(Promise, Axios, Redux-thunk,async/await) 비동기 전체 로직 중 A로직의 처리를 기다리지 않고 처리 하다가 A로직이 처리를 완료 하면 A로직을 완료하는 기법이다. 웹에서 사용시에는 보통 데이터 처리는 화면의 렌더링보다 느리니, 화면의 렌더링을 일단 처리하고 데이터 처리는 요청이 완료 되었을 때, 화면에 뿌려주는 형식으로 사용된다. 그런데 단지 비동기를 그냥 처리만 할 경우에는 다음과 같은 문제점이 생긴다. 1 2 3 4 5 6 7 function a(){ let greet; setTimeout(function(){greet="hello"},1000); console.log(greet); } a() //undefined a() 의 콘솔 결과는 undefined이다. setTimeout은 비동기적으로 작동하는데 greet를 선언하고 setTimout..
[힙(Heap)] 더 맵게, 라면 공장, 이중 우선순위 큐 힙은 완전이진트리자료구조이다. 완전 이진 트리는 다음과 같은 성격을 지닌다. 1. 이진 트리는 하나의 부모에 두개의 자식을 지닌다. 2. 값은 자식의 왼쪽부터 순서대로 입력받는다. 3. 부모는 자식보다 무조건 크거나 작고( 정렬 기준에 따라 다르다.) 고로 Root 노드는 가장 크거나 가장 작다. 이와 같이 힙 구조를 이용하면 완전히 정렬하지 않더라도, 최대값 혹은 최소값을 구할 수 있게 된다. (일반적인 정렬은 nlogn의 시간만큼 드는 반면 힙은 깊이만큼만 실행하므로 logn만큼의 시간 복잡도가 생긴다.) c++ 에서는 이와 같은 힙을 활용해서 만든 STL Container인 우선순위 큐가 있다. 우선순위 큐를 이용하면 모두 정렬하지 않아도 최대값 혹은 최소값을 하나씩 구할 수 있다. 우선순위 큐의 ..