일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Node.js
- 수학
- socket
- 타입스크립트
- HTTP 완벽 가이드
- 백준
- javascript
- dp
- 크롤링
- dfs
- Crawling
- 레벨 1
- 소켓
- 쉬운 문제
- type challenge
- 타입 챌린지
- TCP
- ip
- 자바스크립트
- 프로그래머스 레벨 2
- typescript
- 그래프
- 가천대
- Algorithm
- BFS
- 알고리즘
- Nestjs
- 문자열
- 프로그래머스
- HTTP
- Today
- Total
목록분류 전체보기 (499)
kakasoo
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/Grlpv/btslbwrqdYJ/5yxoSePtzNQyi4qV3Hjrh1/img.png)
어떤 기능을 구현하다보면 외부 요소에 대한 의존성을 강하게 가지게 되는 경우가 있다. 가장 간단한 예시로, 우리는 어떤 데이터베이스를 사용하느냐에 따라 내부 로직이 변경될 것이다. Postgres나 MySQL을 쓰는 경우에, 그 둘의 내부 함수 명이 다르기 때문에 영향을 받게 될 것이고, 만약 ORM을 사용한다고 하더라도 MongoDB와 같은 NoSQL을 사용하면 또 영향을 받게 된다. 데이터베이스 말고도 유저가 보내는 요청들이 무엇인지에 따라서도 서비스는 영향을 받게 될 것이다. 요청은 우리가 제어하는 것 아니냐 반문할 수 있겠지만, 모바일인지 웹인지에 따라서 처리 방식이 다르다. 우리의 핵심 비즈니스 로직들을 내부 라고 정의할 때, 이런 영향을 주는 요소들을 전부 외부 라고 불러보자. Clean Ar..
function* combinations(elements, selectNumber) { for (let i = 0; i < elements.length; i++) { if (selectNumber === 1) { yield [elements[i]]; } else { const fixed = elements[i]; const rest = elements.slice(i + 1); for (const a of combinations(rest, selectNumber - 1)) { yield [fixed, ...a]; } } } } function solution(number) { const answer = []; /** * number 중 3개의 요소를 조합한 후, 그 조합의 합이 0이 되는 케이스를 찾는다...
/** * 프로그래머스 연속 부분 수열 합의 개수 * * 푼 날짜 : 2023.06.04 * * @param {number[]} elements * @returns {number} */ function solution(elements) { /** * 원형으로 쓰인 수열이기 때문에 반복을 표현한다. * 이렇게 하지 않을 경우, `array.prototype.at()`을 이용하는 방법도 있다. */ elements.push(...elements); /** * answer에 시작 지점으로부터 n개를 담았을 때의 부분 수열 합을 모두 담는다. * 반복되었기 때문에 2번 씩 담기는 것을 막고자 length와 start는 모두 전체 길이의 반까지만을 허용한다. */ const answer = []; for (let..
/** * 프로그래머스 귤 고르기 * * 푼 날짜 : 2023.06.04 */ function solution(k, tangerine) { /** * 배열을 이용해서 풀 경우 length가 클 경우 시간 초과가 발생한다. * 따라서 `arr.filter`를 이용하지 않아도 되게끔 객체에 매핑한다. * * { '1': 2, '2': 2 ... }의 형태가 된다. */ const sizeMap = {}; tangerine.map((el) => { sizeMap[el] = sizeMap[el] ? sizeMap[el] + 1 : 1; }); /** * 전체 수에 의해 정렬되게끔 한다. */ const sorted = Object.entries(sizeMap).sort((a, b) ..
it('predict', { only: true }, async () => { type SomeGenericType = T extends '' ? never : string; class TestClass { /** * Error: Error on typia.random(): non-specified generic argument. */ predict1() { return typia.random(); // complie error } /** * non-compile error, but if I call this `predict` method, it occur error. * * for example, `TypeError: $pick(...) is not a function` */ predict2() { r..
type Add1 = Length; type Add2 = [...NTuple, ...NTuple] extends [...infer U] ? Length : never; 흥미롭게도 Add1은 템플릿 문자열 타입 내에서 사용할 수 없다. 즉, 이 `${Add1}` 타입으로 변경하여, 수를 문자로 바꾸는 활용이 불가능한데, 이는 Length 타입의 적용 시점 차이로 보인다. 아직까지는 정확한 이유는 모르겠으나 infer 키워드를 이용한 방식이 문자열 템플릿 타입 내에서 숫자를 사용할 때 더 강력한 것으로 보인다. https://stackoverflow.com/questions/76243178/generic-type-for-adding-two-numbers Generic type for adding two nu..
내가 적용한 시점에는 일일 다운로드 3만 건이었고, 현재는 5만건인 라이브러리다. 서비스에서도 사용하고 있는데 사용성이 무척 좋아서 공유한다. Installation # with npm npm install @liaoliaots/nestjs-redis ioredis # with yarn yarn add @liaoliaots/nestjs-redis ioredis # with pnpm pnpm add @liaoliaots/nestjs-redis ioredis npm: @liaoliaots/nestjs-redis 라이브러리는 @liaoliaots/nestjs-redis 와 **ioredis 이렇게 두 개를 설치해야 하고, 노드 버전은 12.22 이상, NestJS는 9.0.0 이상, ioredis는 5.0.0..
- 모든 것을 테스트한다는 오해 카카수 : 테스트 코드를 도입하려고 해요. 개발자1 : 좋아요. 하죠. 근데, 그걸 한다고 모든 문제가 사라질 건 아니에요. - 작업 방식에 대한 오해 카카수 : 테스트 코드를 도입하려고 해요. 개발자2 : 좋습니다. 근데 GET 요청은 테스트할 필요 없는 거죠? - 시간 낭비에 대한 오해 카카수 : 테스트 코드를 도입하려고 해요. 기획자 : 우리 안그래도 비즈니스가 급한데, 정말 괜찮을까요? 어느 정도 버그는 그냥 넘어가도 되는데? 테스트 주도 개발 이라는 말을 처음 지은 사람은 욕을 먹어야 한다는 얘기를 들었을 때, 그 이유를 이해 못했다. 하지만 이걸 팀원들에게 설명하고 도입하려고 하니 “굳이 왜 테스트를 해야 하느냐”는 질문들이 돌아왔다. 테스트를 해야 하는 이유는..
type IsTuple = [T] extends [never] ? // T가 never 라면 무조건 false여야 한다. false : T extends readonly any[] ? // T가 readonly any[] 라면, number extends T['length'] ? // T의 length가 숫자 상수인지 아닌지 검증하기 위해 number extends T['length']를 한다. false : // 만약 true라면 T['length']는 number인 것이기에 튜플이 아니다. true : // 만약 false라면 T['length']는 숫자 상수 타입이기 때문에 튜플이 맞다. false; // 애초에 T가 readonly any[]가 아니라면 튜플이 아니다. 주석으로 설명을 대체한다.
type ToString= T extends string ? T : never; type ToStringTuple= T extends string[] ? T : never; type Join = T extends [infer F, ...infer Rest] ? `${ToString}${Join}` : ''; type Replace = C extends '' ? never : S extends `${infer F}${infer Rest}` ? F extends C ? [...Replace] : [F, ...Replace] : []; type DropChar = Join DropChar는 문자열에서 특정한 글자가 있을 경우 삭제하는 타입을 구현한다. 사실, 이는 이전에 구현한 R..
문자열로 이루어진 배열을 받아 Join하는 타입을 구현했다. type ToString= T extends string ? T : never; type ToStringTuple= T extends string[] ? T : never; type Join = T extends [infer F, ...infer Rest] ? Rest extends [] ? `${ToString}` : `${ToString}${U}${Join}` : ''; https://kscodebase.tistory.com/709 타입 레벨에서 문자열 Join 구현하기 2 https://kscodebase.tistory.com/682 타입 레벨에서 문자열 Join 구현하기 type ToString= T extends string ? T :..