일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- HTTP 완벽 가이드
- javascript
- dp
- Node.js
- 쉬운 문제
- typescript
- 크롤링
- socket
- 알고리즘
- 자바스크립트
- 프로그래머스
- type challenge
- 소켓
- 레벨 1
- Crawling
- Algorithm
- 수학
- Nestjs
- dfs
- 가천대
- BFS
- HTTP
- 타입스크립트
- ip
- 타입 챌린지
- 프로그래머스 레벨 2
- 그래프
- 문자열
- TCP
- 백준
- Today
- Total
목록프로그래밍 (478)
kakasoo
1 회사에서도 무언가 배우자. 회사에서 배움을 찾는 사람들한테 "직장은 배우러 가는 곳이 아닙니다." 라고 말하는 사람도 있지만, 내 생각엔 배우러 가는 게 맞다. 군대에 가서 삽질만 하더라도 뭔가 배울 게 있었는데 그건 뭘 하는지에 달린 게 아니라 생각을 하느냐 마느냐의 차이였던 것 같다. 어느 환경에서든 생각하기를 멈추질 않으면 배우는 게 있었다. 그러니깐 첫째로는 회사에서도 항상 무언가 배우려고 하자. 그게 개발이든, 아니든. 2 TIL 열심히 하자. 가끔 가다가 남들에게 자랑하고 싶은 게 있다면 TIL 말고 블로그 포스팅도 하자. 3-1 퇴근 후에도 공부하자. 원래 1년의 목표를 정하고 움직였지만, 생각해보니 1년이나 동일한 목표를 가지는 건 불가능했고, 그래서 하루 단위로만 목표를 세우자고 했지..
어떤 기능을 구현하다보면 외부 요소에 대한 의존성을 강하게 가지게 되는 경우가 있다. 가장 간단한 예시로, 우리는 어떤 데이터베이스를 사용하느냐에 따라 내부 로직이 변경될 것이다. 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 :..