일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- NonNullable
- 제네릭
- React.js
- 타입좁히기
- TSDoc
- CSS
- 누구나 자료구조와 알고리즘
- 티스토리꾸미기
- React Native
- 커스텀
- reactjs
- const 단언문
- click and drag
- 성능최적화
- vue.js
- react
- 공통컴포넌트
- JS console
- 2022
- utilty type
- javascript
- typescript
- 타입스크립트
- 레이아웃쪼개기
- 리액트
- 개발콘텐츠
- Chart.js
- returnType
- 폰트적용하기
- 반복줄이기
- Today
- Total
목록Development (384)
몽땅뚝딱 개발자
🗝 내가 푼 코드 function solution(a, b, c) { const count = [a, b, c].reduce((map, cur) => { map[cur] = (map[cur] || 0) + 1 return map }, {}) const 같은숫자의개수 = Math.max(...Object.values(count)) let sum = 1 for (let i=1; i
🗝 내가 푼 코드 function solution(n) { const calculator = { 'even': (list) => list.reduce((acc, cur) => acc += cur * cur, 0), 'odd': (list) => list.reduce((acc, cur) => acc += cur, 0) } const 홀짝판단값 = n % 2 === 0 ? 0 : 1 const list = Array(n).fill(1).map((obj, index) => obj + index).filter((obj) => obj % 2 === 홀짝판단값) return calculator[홀짝판단값 ? 'odd' : 'even'](list) } 홀수, 짝수 list를 만들 때 for문 돌리면 쉽겠지만.. 다른..
내 힘으로 푼 첫 문제..🥺 🗝 내가 푼 코드 function solution(name, yearning, photo) { const point = {} name.forEach((obj, index) => { point[obj] = yearning[index] }) return photo.map((list) => { return list.reduce((acc, cur) => acc + (point[cur] || 0), 0) }) } point object을 만드는 부분을 변수 선언 없이 할 수는 없을까 고민하다 map 함수를 활용하면 될 것 같아서 찾아봤더니 reduce를 사용하는 방법이 있었다! reduce는 지금까지 전체적으로 계산하는 연산이 필요할 때만 사용했었는데 진짜 신세계..🥸 // 처음 버전..
공간 복잡도의 빅 오 공간복잡도는 알고리즘이 얼마나 많은 메모리를 소모하는가이고, 시간복잡도는 알고리즘이 얼마나 빠른가이다. 메모리 제한이 있다면 공간 복잡도도 중요하게 고려되어야 한다. 대량의 데이터를 다루거나 메모리가 제한된 작은 장치를 프로그래밍할 때는 공간 복잡도가 정말 중요하다. 예를 들어, 배열을 받아 중복값이 있는지 확인해 반환하는 함수를 구현할 때 이중 루프를 사용하면 공간을 절약할 수 있지만 속도가 느리고, 해시 테이블과 루프 하나를 사용하면 속도는 빠르지만 공간을 소모한다. 근본적으로 각 상황마다 치소 허용 속도와 메모리 한도를 알아야 한다. 그러한 제약을 이해해야 다양한 알고리즘 중에서 고르고 선택할 수 있고 속도와 메모리 요구사항에 맞게 효율성을 유지할 수 있다. 코드 최적화 기법 ..
그래프 모든 트리는 그래프이다. 1.1 그래프 vs. 트리 그래프는 서로 순환적으로 참고하는 노드가 있을 수 있으나 트리는 사이클이 있을 수 없다. 트리는 간접접으로라도 다른 노드와 연결되지만 그래프는 완전히 연결되지 않을 수 있다. 1.2 용어 정점(vertex): 각 노드를 정점이라고 한다. 간선: 정점을 잇는 선 인접한다: 간석으로 연결된 정점에 대해 서로 인접한다고 말한다. 이웃: 인접한 정점 예제 1. 그래프를 해시테이블로 구현하기 friends = { "Alice" => ["Bob", "Diana", "Fred"] "Bob" => ["Alice", "Diana"] "Diana" => ["Bob"] "Fred" => ["Bob"] } 1.3. 그래프 탐색 정점 찾기는 가장 흔한 그래프 연산 중 ..
15장, 16장 다시 읽어보기 .. 🥺 트리(Tree) 순서를 유지하면서도 빠른 검색과 삽입, 삭제가 가능한 자료 구조가 필요한 경우에 사용한다. 트리도 노드 기반 자료 구조이지만 트리의 각 노드는 여러 노드로의 링크를 포함할 수 있다. 트리의 각 노드에는 다른 두 노드로 이어지는 링크가 있다. 1.1. 개념 루트(root): 가장 상위 노드로 꼭대기에 있다. 부모(parent), 자손(descendant), 조상(ancestor) 레벨(level): 각 줄을 의미한다. 프로퍼티(property): 균형 잡힌 정도이다. 모든 노드에서 하위 트리의 노드 개수가 같으면 그 트리는 균형(balanced) 트리다. 1.2 이진 탐색 트리 이진과 탐색이라는 수식어가 붙는데 이진 트리는 각 노드에 자식이 0개나 1..
연결 리스트(linked list) 1.1. 연결 리스트가 유용한 순간 연결 리스트는 배열과 상당히 유사하지만 자료 구조의 성능에 큰 차이가 있다. 가령 세 번째 node에 있는 값을 읽거나 검색하기 위해서는 첫 번째부터 접근하여 순차적으로 진행해야 하므로 O(N)이다. 따라서 읽기와 검색에서는 유의미한 차이가 없지만 연결 리스트는 삽입에서 빛을 발휘한다. 배열에서 최악의 시나리오는 인덱스 0에 데이터를 삽입하거나 삭제할 때이다. 나머지 데이터를 한 셀씩 오른쪽으로 옮겨야 하기 때문에 효율성은 O(N)이 된다. 반면 연결 리스트는 딱 한 단계인 O(1)만 걸린다. 삽입하는 경우 배열처럼 한 셀씩 옮기는 것이 아니라 기존 리스트 앞에 새 노드를 생성하고 노드가 이전의 첫 번째 노드를 가리키도록 만들면 된다..
퀵 정렬(Quicksort) 버블 정렬, 선택 정렬, 삽입 정렬같은 알고리즘이 있지만 대부분의 언어에서는 퀵 정렬(Quicksort)를 선택한다. 퀵 정렬은 매우 빠른 정렬 알고리즘으로 평균 시나리오에서 효율적이다. 최악의 시나리오에서는 삽입 정렬, 선택 정렬과 성능이 유사하지만 대부분의 경우의 평균 시나리오에서는 훨씬 빠르다. 1.1. 퀵 정렬의 분할 퀵 정렬은 분할이라는 개념에 기반한다. 배열을 분할 한다는 것은 배열로부터 임의의 수인 피벗(pivot)을 가져와 피벗보다 작은 모든 수는 피벗의 왼쪽에, 피벗보다 큰 모든 수는 피벗의 오른쪽에 둔다. 1. 여기서 3을 피벗으로 지정하고 두 개의 포인터를 사용한다. 0 pointer1 5 2 1 6 pointer2 3 pivot 2. 왼쪽 포인터를 한 셀..
재귀 함수 올바르게만 사용하면 재귀는 강력한 도구가 될 수 있다. 사용 예시 1. 카운트다운 함수를 for문으로 작성할 수도 있겠지만 재귀를 사용할 수도 있다. // for문으로 작성 function countdown(number) { for (let i=number i>=0; i--) { console.log(i); } } // 재귀로 작성 function countdown(number) { console.log(i); if (number === 0) { return; } else { countdown(number - 1); } } 사용 예시 2. 모든 하위 디렉토리까지 반환하는 함수의 경우 하위 디렉토리의 단계를 알 수 없다. 이 때 재귀를 사용하여 원하는 만큼 아래로 가 하위 디렉토리를 알 수 있다..
스택(stack) 1.1. 정의 스택이 데이터를 저장하는 방법은 배열과 같으며 단순히 원소들의 리스트이다. 스택 연산을 묘사하는 데 쓰이는 유용한 두문자어가 LIFO(Last In, First Out)이다. 스택은 다음과 같은 세 가지 제약이 있다. 데이터는 스택의 끝에만 삽입할 수 있다. 데이터는 스택의 끝에서만 삭제할 수 있다. 스택의 마지막 원소만 읽을 수 있다. 접시 더미나 수직으로 놓인 배열로 묘사하여 생각해보자. 1.2. 용어 푸시(push): 스택에 값을 추가하는 것 팝(pop): 스택의 위에서 원소를 제거하는 것 예를 들어, 대괄호와 중괄호가 잘 닫혔는지 확인하는 linter를 구현한다고 쳐보자. "var a = { y: [1, 2, 3] }"라는 문장을 처리할 때 각 여는 괄호를 만날 때..