# week1: 분할 정복 알고리즘 > 참고 PR: [#2](https://github.com/gyesswhat/2026-algorithm-study/pull/2) [#4](https://github.com/gyesswhat/2026-algorithm-study/pull/4) [#6](https://github.com/gyesswhat/2026-algorithm-study/pull/6) [#8](https://github.com/gyesswhat/2026-algorithm-study/pull/8) [#10](https://github.com/gyesswhat/2026-algorithm-study/pull/10) ## 리스트 & 연산 - `[] @ lst2`는 괜찮지만 `lst1 @ []`는 O(n) — F# 리스트가 singly linked list라 변수 이름만 쓰면 O(1) - `lst.Length` 대신 `List.length lst`가 더 함수형다운 표현 - 인덱싱은 `lst.[..mid]`보다 `lst[..mid]`가 가독성에 좋음 ## 패턴 매칭 - `match` 아래 `|` 작성 시 추가 indentation 없이 작성 - 두 패턴에서 동일한 로직이라면 하나로 합치기, 한 줄에 묶기 - `| _ as lst ->` 대신 `| lst ->`로 충분 - nested match가 발생하면 함수로 리팩토링 - 패턴 매칭은 if-elif-else와 동일한 의미의 syntax sugar — readability 기준으로 선택 ## 함수 설계 - 마지막 parameter를 바로 match할 경우 `function`으로 대체 가능 (currying 활용) - 변수가 필요하면 `as [name]` 붙이기, 필요 없으면 생략 - 함수는 작을수록 좋음 (기능별 분리, 한눈에 파악 가능한 크기) - 함수 호출로 디테일을 숨기고 high-level 아이디어를 전달 — 단, 과하게 숨겨서 기능 파악이 어려우면 안 됨 - function은 first-class — pivot selector처럼 전략이 되는 부분은 parameter로 받는 템플릿 함수로 중복 제거 ## 변수 & 네이밍 - 안 쓰는 변수는 이름 대신 wildcard `_` 사용 - 유의미한 변수명 사용 습관 - `list`는 타입 이름과 겹치므로 다른 이름 사용 ## 파이프 연산자 - 함수에 값 적용할 때 공백으로 띄어쓰기: `quickSort (List.filter ...)` → pipe로 개선 - `lst |> List.filter (fun x -> x < pivot) |> quickSort` - pipe 한 번만 쓸 때 기준: - `List.map func lst` vs `lst |> List.map func` — 가독성 차이 없으면 글자 적은 전자 - `anotherFunc lst |> List.map func` — 괄호 없이 왼쪽→오른쪽으로 읽히는 흐름이 자연스러움 - `Llst |> anotherFunc |> List.map func` 스타일 고려 ## 타입 & 스타일 - F#에 익숙해지면 명시적 type 표기 제거 → 가독성 향상 - 조건문에 괄호 불필요 - record type에서 값 생성이 여러 번 필요하면 `static member` initializer로 정의 - 적절한 공백은 가독성에 도움 (MS F# formatting guideline 참고) - 적당한 기준(예: 80자)으로 줄 바꿈 여부 결정 ## List 순회 최적화 - `List.filter` 3번 대신 `List.fold` 1번으로 small / middle / large 그룹을 한 번에 수집 # week2: 그리디 알고리즘 # week3: 동적 계획 알고리즘 # week4: 정렬 알고리즘 # week5: 그래프 알고리즘 # week6 해 탐색 알고리즘 # week7 문제 풀이