전체 글

전체 글

    [Javascript] Lazy evaluation(지연 평가)

    컴퓨터 프로그래밍에서 Lazy evaluation은 계산의 결과 값이 필요할 때까지 계산을 늦추는 기법. Javascript에서는 배열 데이터 구조를 많이 쓰는데, 연산의 성능을 끌어올리기 위해 필요한 기법 중 하나이다. 예시 1. 엄격한 평가 Array(100000).fill().map((v, i) => i) .map((v) => v + 1) .filter((v) => v % 3 === 0) .slice(0, 10); //[ 3, 6, 9, 12, 15, 18, 21, 24, 27, 30 ] 0부터 10만까지의 숫자가 담긴 배열 각각의 요소에 1씩을 더해서 3의 배수가 되는 숫자 10개만 추리는 코드. map에서 10만 filter에서 10만 slice에서 10해서 총 200010번의 연산을 해야한다...

    [Javascript] Generator Function

    단 한 번의 실행으로 함수의 끝까지 실행이 완료되는 일반 함수와는 달리, 제너레이터 함수는 사용자의 요구에 따라 (yield와 next를 통해) 일시적으로 정지될 수도 있고, 다시 시작될 수도 있다. 또한, 제너레이터 함수의 반환으로는 제너레이터가 반환된다. Generator / yield Generator는 이 제너레이터 함수의 반환으로 iterable 프로토콜과 iterator 프로토콜을 따르는 객체이다. 이 때, 제너레이터의 이터러블에서 반환하는 이터레이터는 자기 자신이다. function* generator(params) { yield 'hello'; yield 'world'; // statements return 'hi'; } const resultGenerator = generator(); c..

    [Javascript] 커링(Currying)이란

    [Javascript] 커링(Currying)이란

    수학과 컴퓨터 과학에서 커링(currying)이란 다중 인수 (혹은 여러 인수의 튜플)을 갖는 함수를 단일 인수를 갖는 함수들의 함수열로 바꾸는 것을 말한다. 커링의 사용 예시 커리 함수는 '함수를 매개 변수로' 받는다. 커리 함수는 실행 시점에 매개 변수로 받은 함수의 인자를 사용하는 함수를 다시 반환한다. 반환되는 함수는 Lexical scope 개념에 의해 커리 함수에 전달된 함수를 기억한다.(= 클로저) Step 1. 커링 대상 함수 선언 커링 대상 함수인 sum은 매개 변수로 num1, num2 두 개를 받는다. function sum(num1, num2) { return num1 + num2; } console.log(sum(10, 20)); // 30 Step 2. 커링 함수 선언 커리 함수..

    [백준 2108] 통계학 / 배열 요소의 최빈값 구하기 / Object.entries()

    [백준 2108] 통계학 / 배열 요소의 최빈값 구하기 / Object.entries()

    https://www.acmicpc.net/problem/2108 2108번: 통계학 첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다. www.acmicpc.net 셋째 줄 최빈값 구하는것 때문에 애를 많이 먹었습니다. let input = z.toString().trim().split('\n').map(Number) let N = input[0] // 개수 const arr = input.slice(1); // 정수 배열 let a = Math.round(arr.reduce((acc,cur) => acc+cur) / N ) // 1. 산술평균 let b = arr.sor..

    [백준 18870] 좌표 압축 / Map

    [백준 18870] 좌표 압축 / Map

    https://www.acmicpc.net/problem/18870 18870번: 좌표 압축 수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다. Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표의 개수와 같아야 한다. X1, X2, ..., XN에 좌 www.acmicpc.net let input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n') let arr = input[1].split(' ').map(Number) /// [ 2, 4, -10, 4, -9 ] 입력된 좌표 let set = [...new Set(arr)].sort((a,b)..

    [백준 1181번] 단어정렬 / Set(배열중복제거) / localeCompare() (단어정렬)

    [백준 1181번] 단어정렬 / Set(배열중복제거) / localeCompare() (단어정렬)

    https://www.acmicpc.net/problem/1181 1181번: 단어 정렬 첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다. www.acmicpc.net let input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n') const result = [...new Set(input.slice(1))] .sort((a,b) => a.length-b.length || a.localeCompare(b)); console.log(result.join('\n')) lo..

    리액티브 프로그래밍(Reactive Programming)

    리액티브 프로그래밍(Reactive Programming)

    Reactive programming (반응형 프로그래밍) 리액티브 프로그래밍은 데이터 흐름(data flows)과 변화 전파에 중점을 둔 프로그래밍 패러다임(programming paradigm)이다. 이것은 프로그래밍 언어로 정적 또는 동적인 데이터 흐름을 쉽게 표현할 수 있어야하며, 데이터 흐름을 통해 하부 실행 모델이 자동으로 변화를 전파할 수 있는 것을 의미한다. 예를 들어, 데이터 A의 변화에 따라 데이터 B의 값이 변화하는 방식을 리액티브 프로그램이라 칭함. 리액티브 프로그래밍을 사용하는 이유 좋은 프로그램은 메인스레드가 멈추거나 느려지지 않도록 해서, 사용자들에게 부드러운 사용자 경험과 좋은 성능을 제공할 수 있어야 한다. 메인스레드를 자유롭게 유지하려면 무겁고 시간이 오래 걸리는 작업은 ..

    시리즈 A B C란

    시리즈 A B C란

    투자를 A~C로 구분 짓는 것은 미국 실리콘밸리 관행이 그대로 넘어온 것이다. 초기엔 스타트업의 경영권 보호를 위한 우선주 매입을 뜻하는 것이었지만 지금은 초기 투자금의 단계를 뜻하는 피상적 용어로 사용된다. 시리즈 A 단계 시장 검증을 마친 시제품 / 베타버전을 정식으로 오픈하기 위해 준비하는 단계 장기적인 수익창출을 위한 비즈니스 모델 개발 및 스케일 업 필요 투자금은 서비스 출시 및 모니터링 / 마케팅에 이용 VC(벤처캐피탈)들이 본격적으로 참여하는 단계 시리즈 B 단계 시리즈 A를 통해 인정받은 서비스로 사업을 확장, 자금을 확보하는 단계 어느 정도 규모의 고객을 모은 기업이 시장 점유율을 높이기 위해 받는 투자 투자금은 적극적인 마케팅 / 인력확장 / 연구개발 등을 위해 사용 시리즈 C~E ....

    객체지향 5원칙 SOLID

    객체지향 5원칙(SOLID)이란 SOLID란 유명한 Clean Code의 저자 로버트 C. 마틴(Robert C. Martin)이 2000년대 초에 명명한 객체 지향 프로그래밍의 다섯 가지 기본 원칙을 마이클 페더스가 원칙의 앞 글자를 따서 다시 SOLID라는 이름으로 소개한 것. SRP(The Single Responsiblity Principle) : 클래스나 모듈을 변경할 이유가 하나, 단 하나뿐이어야한다는 원칙이다. OCP(The Open Close Principle): 클래스는 확장에는 열려있어야 하며 변경에 닫혀 있어야 한다. LSP(The Liskov Substitution Principle) : 서브타입은 그것의 기반 타입에 대해 대체 가능해야한다. DIP(The Dependency Inv..

    멱등성과 HTTP메소드

    멱등성 (Idempotent) 같은 연산을 여러번 실행해도 그 결과가 달라지지 않는 성질을 의미. ex) const sum = (a,b) => a+b 동일한 인자를 넣고 여러번 실행시켜도 같은 값을 반환하기 때문에 멱등성을 갖는다. HTTP Method 의 멱등성 멱등성의 개념은 HTTP 에서도 동일하게 적용될 수 있다. 동일한 요청을 한번 보내는 것과, 여러번 보내는 것이 서로 동일한 효과를 지니고, 서버의 상태도 동일하게 남을 때 해당 HTTP Method 가 멱등성을 갖는다고 이야기한다. 멱등성을 따질 때에는 서버의 상태만 바라보면 되며, HTTP 응답 Status는 신경쓰지 않아도 된다. 멱등성을 갖는 메소드 GET : 서버에 존재하는 리소스를 단순히 읽어오기만 하는 메소드이기 때문에 당연히 여러..