# 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 문제 풀이