javascript 7

[Javascript] 재귀 함수의 스택 오버플로우 문제

n!을 구하기 위한 factorial(n) 함수를 재귀 함수로 구현한 상황에서 n 값이 매우 클 때 발생할 수 있는 문제는? Factorial 함수 function factorial(n) { if (n === 1) { return 1; } return n * factorial(n-1); } factorial(4); // 4*3*2*1 => 24 [문제 1] 숫자 값이 너무 크면 표현할 수 있는 int의 범위를 넘어설 수 있다. 20! = 20×19×18×...×2×1 = 2,432,902,008,176,640,000 factorial(n)의 n이 20이 되어도 엄청 큰 수가 나온다. Number 타입은 배정밀도 64비트 이진 형식 IEEE 754 값(-(2^53 − 1)부터 2^53 − 1까지의 수)이다..

[Algorithm] Job Scheduling - Javascript

[LeetCode 1235번] Maximum Profit in Job Scheduling - LeetCode Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com 1. 문제 startTime과 endTime이 정해져 있는 작업 데이터로, 최대 profit을 만들 수 있는 작업의 조합을 찾는 문제이다. 2. 해결 Job Scheduling은 DFS를 통해 완전 탐색으로 풀 수는 있겠지만, 문제의 조건에 따라 오버플로우가 발생할 수 있다. 우리는 DP와 이진 탐색을 활용하여 O(N log..

[Review] 실무에서 바로 쓰는 Frontend Clean Code

본 포스팅은 [토스] Youtube 채널의 "SLASH 21 - 실무에서 바로 쓰는 Frontend Clean Code" 영상을 보고 작성한 리뷰입니다. [목차] - 실무에서 클린 코드의 의의 - 안일한 코드 추가의 함정 (코드 리팩토링 예제) - 로직을 빠르게 찾을 수 있는 코드 1. 응집도 2. 단일책임 3. 추상화 실무에서 클린 코드의 의의 좋지 않은 코드란 무엇일까? 1) 좋지 않은 코드는 흐름 파악이 어렵다. 2) 좋지 않은 코드는 도메인 맥락 표현이 안 되어 있다. 3) 좋지 않은 코드는 동료에게 물어봐야 알 수 있는 코드이다. 좋지 않은 코드는 개발의 병목이 되며, 유지보수할 때 시간이 오래 걸리며, 기능 추가가 불가능할 수도 있다. 따라서, 우리는 읽기 좋은 코드를 작성하여, 코드 리뷰 시..

[CS] Javascript로 LRU Cache 구현하기

1. LRU Cache 1) Cache Cache는 연산에 필요한 데이터나 값을 미리 가져다놓는 임시 메모리다. 메인 메모리에 접근하여 데이터를 가져오는 비용이 크기 때문에 자주 사용되는 값이나 앞으로 사용될 예정인 값은 가까운 캐시에 저장하여 저비용으로 접근하기 위해 사용된다. CPU는 어떤 값이 필요할 때, 캐시 -> 메모리 -> 디스크 순으로 방문하여 값을 찾는다. 2) LRU(Least Recently Used) Cache 캐시는 저장 공간이 작기 때문에, 캐시에 새로운 값을 저장할 때 공간이 가득 차 있는 상태라면, 특정 데이터와 교체를 하므로써 저장되어야 한다. 이 때, 어떤 데이터를 교체할 것인지 판단하는 것을 페이지 교체 알고리즘이라고 하며, LRU는 이 페이지 교체 알고리즘 중 하나이다...

Javascript 함수 리팩토링 과정

본 포스팅은 javascript 함수를 정의할 때, 리팩토링하는 과정을 예제로 다루고 있습니다. 0. 요구사항 분석 요구사항 특정 날짜의 Date 객체를 인수로 받아 새로운 포맷("yyyy-mm-dd")으로 변경한다. 함수 예시 formatDate(new Date('2021/01/04')) 반환 "2021-01-04" 1. 요구사항을 만족하는 것이 가장 우선이다. 좋은 코드의 1순위는 요구사항을 모두 만족하는 코드입니다. '좋은 코드'라는 강박에 사로잡혀 기능 구현도 되지 않은 코드를 리팩토링하려는 것은 능숙한 개발자가 아닌 이상 개발 시간을 늦추기만 할 뿐입니다. 처음부터 잘 작성하려는 것보다는 일단 기능 구현을 완성한 후, 리팩토링을 진행하는 방향이 많은 개발자들로부터 권장되고 있습니다. functi..

[온라인 선거 홍보 서비스] 프로젝트 회고 - UNIVVOTE편

본 포스팅은 2020년 하반기에 진행한 개인 프로젝트 [UNIVVOTE]에 대한 회고 기록입니다. 프로젝트 명 : UNIVVOTE 프로젝트 기간 : 2020.10 ~ 2020.11 (2개월) 프로젝트 설명 : OO대학교 온라인 선거 홍보 서비스 1. UNIVVOTE 프로젝트를 하게 된 이유 1-1. 왜 프로젝트를 하는가 많은 개발자들이 프로젝트를 통해 새로운 기술과 지식들을 접하는 기회를 얻는다고 생각했습니다. 웹 서비스가 세상에 나오기까지 어떤 과정들이 필요한 지 알기 위해서는 직접 만들어보는 것이 도움이 될 것이라 판단하여 직접 배포하여 사용자를 발생시키는 것을 목표로 서비스를 기획하기 시작했습니다. 1-2. 왜 선거 프로젝트를 하는가 혼자 프로젝트를 진행하기로 결심하고, 나에게 혹은 내 주변에 어떤..

[TIL] - [Javascript] 커링 Curring (& Partial application)

Currying What? 커링은 f(a, b, c)처럼 단일 호출로 처리하는 함수를 f(a)(b)(c)와 같이 각각의 인수가 호출 가능한 프로세스로 호출된 후 병합되도록 변환하는 것입니다. 커링은 언어에 상관 없이 존재하는 하나의 기법입니다 Partial Application: 함수를 반환하는 함수이지만 함수가 받는 인자는 하나일 필요는 없다. 여러 개를 받을 수도 있다. // Currying function const add = x => y => z => x + y + z; // Partial Application function const add = x => (y, z) => x + y + z; Why? Lazy evaluation (지연 평가) : 계산의 결과 값이 필요할 때 까지 계산을 늦추는 ..