"매 큰 문제를 매 작은 문제로 매 쪼개고 매 합쳐라". Problem Solving은 매 ill-defined situation을 매 well-defined sub-problem 으로 매 decompose 하고 매 solve → compose 하는 매 universal methodology. Polya (1945) 부터 매 modern algorithmic thinking, 매 LLM tool-use planning 까지 매 backbone.
매 핵심
매 4-step (Polya)
Understand: input/output/constraint 매 명확화.
Plan: 매 known problem과 매 mapping, 매 sub-goal 분해.
Execute: 매 plan 매 step-by-step.
Review: 매 verify, 매 generalize.
매 Heuristic toolkit
Decomposition: divide-and-conquer.
Analogy: 매 known problem → 매 transform.
Working backward: goal에서 매 출발.
Invariant: 매 변하지 않는 property 매 식별.
Specialization: 매 simpler case 먼저.
Generalization: 매 더 일반 case로 매 abstract.
매 응용
Algorithm design.
System architecture (decomposition into services).
Debugging (Problem Solving Skills 참고).
LLM agent planning (ReAct, ToT).
Research project scoping.
💻 패턴
Decomposition template
# 매 1. Restate# Goal: 매 sort N items by key with stable + in-place# Inputs: list[T]; Outputs: list[T] sorted# Constraints: stable, O(1) extra space, T comparable# 매 2. Plan — sub-problems# (a) partition pivot (in-place quicksort)# (b) but quicksort 매 unstable → swap to merge sort?# (c) merge sort 매 not in-place → block merge sort (Wikisort)# 매 3. Execute — pick block merge sortdefblock_merge_sort(a):...# 매 implement# 매 4. Review — invariants, edge cases (empty, dupes, all-equal)
Working backward (puzzle solving)
# Find x such that f(g(h(x))) == target# Backward: y = f^-1(target); z = g^-1(y); x = h^-1(z)defbackward(target,inverses):cur=targetforinvinreversed(inverses):cur=inv(cur)returncur
Invariant-based proof (loop)
defgcd(a,b):# 매 Invariant: gcd(a0, b0) == gcd(a, b) at every iterationwhileb:a,b=b,a%breturna
Specialization → Generalization
# 매 Step 1 — special case: 매 sorted list, no duplicatesdeffind_special(arr,t):lo,hi=0,len(arr)-1whilelo<=hi:mid=(lo+hi)//2ifarr[mid]==t:returnmidifarr[mid]<t:lo=mid+1else:hi=mid-1return-1# 매 Step 2 — generalize: 매 with duplicates → leftmost binary searchdeffind_general(arr,t):lo,hi=0,len(arr)whilelo<hi:mid=(lo+hi)//2ifarr[mid]<t:lo=mid+1else:hi=midreturnloiflo<len(arr)andarr[lo]==telse-1
LLM agent decomposition (ReAct loop)
# 매 Pseudo-ReActdefsolve(task,llm,tools,max_steps=10):history=[{"role":"user","content":task}]for_inrange(max_steps):out=llm.chat(history)# Thought + Actionifout.is_final:returnout.answerresult=tools[out.action](out.args)# Observationhistory+=[out.message,{"role":"tool","content":result}]returnNone