Storybook이란?전통적으로는 페이지 단위로 개발하는 경우가 많지만 최근에는 버튼, 카드, 모달 같은 작은 컴포넌트 단위로 쪼개서 개발하는 것이 중심이 되고 있다.Storybook은 이러한 컴포넌트를 애플리케이션과 분리하여 독립적으로 실행하고 확인할 수 있는 개발 환경이다.페이지 먼저 만들고 컴포넌트 끼워넣기 X -> 컴포넌트 먼저 만들고 페이지를 조립 O왜 쓰나요 ?컴포넌트 독립 개발API 없이 개발 가능라우팅/전역 상태 없이 테스트 가능UI에만 집중 가능디자인 시스템 구축컴포넌트 상태를 미리 정의팀 내 UI 기준 통일문서화 & 협업props 기반 자동 문서 생성디자이너, 기획자와 공유 가능테스트 & QA상태별 UI 즉시 확인시각적 회귀 테스트 가능전체 구조 이해 Storybook은 “컴포넌트 + ..
📌 개념그래프에서 경로, 연결, 순서, 최소 비용을 찾기 위한 심화 알고리즘들다익스트라 (Dijkstra)한 노드 -> 모든 노드 최단 거리가중치가 있는 그래프음수 가중치는 사용 불가우선순위 큐(Heap) 사용플로이드 워셜 (Floyd-Warshall)모든 노드 -> 모든 노드 최단 거리3중 반복문 DP 방식노드 수가 적을 때 사용유니온 파인드 (Union-Find)두 노드가 같은 집합인지 판별집합을 합치는 자료구조사이클 판별에 많이 사용MST (Minimum Spanning Tree)그래프의 모든 노드를 최소 비용으로 연결크루스칼 (Kruskal) -> 간선 중심프림 (Prim) -> 노드 중심위상 정렬 (Topological Sort)방향그래프에서 순서를 정하는 알고리즘선후 관계가 있는 작업 처리?..
📌 개념동적 계획법 (Dynamic Programming)은 큰 문제를 작은 문제로 나누어 해결하고 그 결과를 저장하여 재사용하는 알고리즘같은 계산을 여러 번 하지 않도록 중간 결과를 저장하는 것이 핵심주로 재귀 구조를 가지는 문제에서 사용됨DP가 적용 가능한 조건1. Overlapping Subproblem같은 부분 문제가 여러 번 등장2. Optimal Substructure부분 문제의 최적해가 전체 문제의 최적해로 이어짐DP 구현 방식1. Top-down (Memoization)재귀 + 메모이제이션2. Bottom-up (Tabulation)반복문으로 DP 테이블 채우기🎯 왜 사용하는가일반 재귀는 같은 계산을 반복해서 수행중복 계산 제거시간 복잡도 크게 감소⏱ 시간 복잡도방식시간 복잡도일반 재귀..
📌 개념Greedy(탐욕 알고리즘)는 매 순간 가장 최선이라고 생각되는 선택을 하는 알고리즘전체 최적해를 찾기 위해 부분 최적해(local optimum)를 선택문제에서 Greedy가 가능한 조건이 만족되어야 정답이 보장됨대표 조건Greedy Choice Property현재 선택이 이후 선택에 영향을 주지 않음Optimal Substructure부분 문제의 최적해가 전체 문제의 최적해로 이어짐구현 문제특정 알고리즘이 아니라 문제에서 요구하는 동작을 그대로 코드로 작성하는 문제조건 처리, 반복문, 배열 조작 등이 중요🎯 왜 사용하는가Greedy빠르고 구현이 단순하기 때문에 코딩테스트에서 매우 자주 등장구현 문제문제를 정확히 해석하고 요구사항을 코드로 옮기는 능력을 평가할 때 사용⏱ 시간 복잡도유형주요 ..
📌 개념그래프(Graph)는 정점(Vertex)과 간선(Edge)으로 이루어진 자료구조노드 간 연결 관계를 표현할 때 사용코딩테스트에서는 대부분 인접 리스트로 그래프를 표현그래프 탐색 방법DFS (Depth First Search) : 한 방향으로 끝까지 탐색 후 되돌아옴BFS (Breadth First Search) : 가까운 노드부터 순서대로 탐색그래프 탐색을 통해 해결할 수 있는 것연결 여부경로 탐색최단 거리사이클 여부🎯 왜 사용하는가노드 간 연결 관계 문제를 해결하기 위해 사용대표적인 상황친구 관계네트워크 연결지도 이동게임 맵 탐색SNS 팔로우 관계코딩테스트 문제연결된 노드 찾기그래프 탐색최단 경로사이클 탐지⏱ 시간 복잡도그래프 표현 방식DFSBFS인접 리스트O(V+E)O(V+E)인접 행렬O..
📌 개념가능한 경우의 수를 재귀적으로 탐색조건에 맞지 않는 경우 더 이상 탐색하지 않고 되돌아가는 방식완전탐색 + 가지치기(pruning)가능한 모든 경우 탐색 ↓조건 안 맞으면 중단 ↓이전 상태로 되돌아감🎯 왜 사용하는가경우의 수를 직접 만들어야 할 때조합 / 순열 / 부분집합 문제조건을 만족하는 모든 경우 찾기DFS + 재귀 형태로 구현됨⏱ 시간 복잡도문제 유형시간복잡도순열O(N!)부분집합O(2^N)조합O(2^N)⚙️ 구현 핵심 포인트재귀 DFS 구조function dfs() { for (...) { dfs() }}현재 상태 저장const path = []방문 체크const visited = Array(n).fill(false)되돌리기 (Backtracking..
📌 개념가능한 모든 경우의 수를 전부 확인하는 방법구현은 단순하지만 경우의 수가 많으면 느림정답이 반드시 존재한다면 찾을 수 있는 가장 확실한 방법🎯 왜 사용하는가문제 크기(N)가 작을 때규칙이 안 보일 때최적화 방법이 떠오르지 않을 때모든 경우를 직접 만들어야 할 때⏱ 시간 복잡도유형시간복잡도1중 반복문O(N)X중 반복문O(N^X)부분집합O(2^N)순열O(N!)⚙️ 구현 핵심 포인트반복문으로 모든 조합 생성for (let i = 0; i 조건을 바로 검사if (조건) { // 정답 갱신}최대/최소값 갱신 패턴let max = -Infinitymax = Math.max(max, value)🧩 대표 문제 유형두 수의 합세 수의 합부분 문자열 찾기모든 쌍 비교 문제약수 구하기최댓값/최솟값 찾기⚠️ 자..
📌 개념정렬된 배열에서 탐색 범위를 절반씩 줄여가며 찾는 방법가운데(mid) 값을 기준으로 왼쪽 or 오른쪽만 탐색절반씩 버린다 !🎯 왜 사용하는가선형 탐색 O(N) -> 느림이분 탐색 O(log N) -> 매우 빠름데이터가 클수록 차이 큼⏱ 시간 복잡도경우시간 복잡도탐색O(log N)정렬 + 탐색O(N log N)⚙️ 구현 핵심 포인트배열은 반드시 정렬되어 있어야 함mid 계산const mid = Math.floor((left + right) / 2)반복 조건while (left 값 비교 후 범위 조정if (arr[mid] === target)if (arr[mid] 🧩 대표 문제 유형특정 값 찾기lower bound / upper bound랜선 자르기예산 배정입국 심사파라메트릭 서치 (조건 만족 ..
📌 개념데이터를 일정한 기준에 따라 순서대로 나열하는 것[5, 1, 4, 2] → [1, 2, 4, 5]정렬 기준오름차순 / 내림차순숫자 기준문자열 길이 기준객체의 특정 속성 기준🎯 왜 사용하는가정렬은 문제를 쉽게 만드는 전처리 도구대표 효과이분 탐색 가능중복 제거 쉬움그리디 문제 해결투포인터 사용 가능최솟값/최댓값 빠르게 접근⏱ 시간 복잡도알고리즘평균최악버블 정렬O(N^2)O(N^2)선택 정렬O(N^2)O(N^2)삽입 정렬O(N^2)O(N^2)병합 정렬O(N log N)O(N log N)퀵 정렬O(N log N)O(N^2)JS 기본 sortO(N log N) 설전 코테에서는 O(N log N) 정렬 사용⚙️ 구현 핵심 포인트숫자 정렬 시 비교 함수 필수JS는 기본적으로 문자열 정렬// 잘못된 예[1..
📌 개념문자열은 문자의 순서가 있는 자료구조내부적으로는 문자 배열과 유사인덱스로 접근 가능const s = "hello"s[0] // hs[1] // e선형 구라 앞에서부터 순차 탐색이 기본🎯 왜 사용하는가문자열은 코테에서 가장 많이 등장하는 자료형주요 사용 목적패턴 찾기회문 검사문자 빈도 게산압축/변환파싱 (숫자/단어 분리)아나그램 검사문자열 정렬⏱ 시간 복잡도연산시간인덱스 접근O(1)길이 확인O(1)문자열 순회O(N)slice()O(N)includes()O(N)split()O(N)문자열 덧붙이기O(N)문자열은 불변수정하면 새 문자열 생성⚙️ 구현 핵심 포인트문자열은 수정 불가수정하려면 새로 만들어야 함let s = "abc"s[0] = "z" // 안 바뀜반쪽 덧붙이기 주의많으면 O(N^2) 될..