
2025.03.21
2주차의 첫날 새로운 알고리즘 문제를 풀어보자.
WEEK02 :
이분 탐색, 분할 정복, 스택, 큐, 우선순위 큐, Linked List, 해시 테이블
재귀에 대한 알고리즘 특강을 들었다.
| 용어 | 정의 | 언제 쓰이는가 |
|---|---|---|
| 이분 탐색 | 정렬된 범위에서 절반씩 잘라가며 탐색 | 값의 정확한 위치, 존재 여부 찾기 |
| 결정 문제 | 어떤 조건을 만족하는지 참/거짓을 판별 | 조건을 만족하는지 판단할 수 있을 때 |
| 파라메트릭 서치 | 결정 문제를 활용해서 최적의 값을 찾는 탐색 | 어떤 수가 "최적의 해"인지 찾고 싶을 때 |
정렬된 배열에서 값을 찾기 위해, 중간 값을 기준으로 절반씩 탐색 범위를 줄여가는 알고리즘
python
복사편집
arr = [1, 3, 5, 7, 9]
target = 5
어떤 조건을 만족하는지에 대한 "예/아니오(참/거짓)" 문제
True 또는 False로 판단"절단기 높이를 15로 했을 때, 잘린 나무 길이가 20 이상인가?"
→ 가능하면 True, 아니면 False
결정 문제를 활용해서 최적의 값을 찾는 탐색 기법
즉, "가능한 값들 중 가장 큰(혹은 작은) 값"을 찾기 위해 이분 탐색을 적용하는 것
| 개념 | 설명 |
|---|---|
| 이분 탐색 | 절단기 높이(H)를 0~최댓값 범위에서 반씩 줄이며 탐색 |
| 결정 문제 | 어떤 H 값에서 잘린 나무 길이가 M 이상인지? (True/False) |
| 파라메트릭 서치 | 가능한 H 값 중 가장 큰 값 찾기 (조건 만족하는 최대값) |
| 개념 | 핵심 질문 | 결과 | 사용 목적 |
|---|---|---|---|
| 이분 탐색 | 이 값이 있나? | 위치 또는 여부 | 특정 값 찾기 |
| 결정 문제 | 이 조건을 만족하나? | True / False | 조건 판별 |
| 파라메트릭 서치 | 조건 만족하는 최대/최소 값은? | 값 | 최적해 찾기 |
챗지피티가 알려준 개념들이다.
문제를 결정문제로 바꾸고 이분 탐색을 통해서 문제를 해결하는 과정.
결정문제로 바꾸는 아이디어를 떠올리는게 어렵다. 문제를 많이 풀면 해결이 되려나?
import sys
input = sys.stdin.readline
N, C = map(int,input().split())
houses = []
for i in range(N):
houses.append(int(input().strip()))
houses.sort()
min_dist = 1
max_dist = houses[-1] - houses[0]
result = 0
while min_dist <= max_dist:
try_dist = (min_dist + max_dist) // 2
last_installed = houses[0]
count = 1
for i in range(1, N):
if houses[i] - last_installed >= try_dist:
count += 1
last_installed = houses[i]
if count >= C:
result = try_dist
min_dist = try_dist + 1
else:
max_dist = try_dist - 1
print(result)
알고리즘 : 목적을 위한 레시피
알고리즘 이전에 문제를 명확히
알고리즘 기술하기
자연어 → 수도 코드 → programing code
- 알고리즘 분석하기
- correctness proof : 수학적 귀납법(induction)을 통해 증명
- running time analysis : 점화식을 구하고 증명
Recursion(재귀)
Reduction
ex) 배열 a[0-n] 에서 최솟값 찾기 → 1. 정렬하기 2. A[0] 출력
- selection 문제를 sorting 문제로 reduce
결국 recursion은 자신 스스로의 reduction
결국 reduction 된 함수의 동작 과정을 신경쓰지마라!(Delegate)
재귀에 대한 자신감을 얻고 좀더 명확해진 느낌이 든다.