[Algorithm][κ·Έλž˜ν”„] λ„ˆλΉ„μš°μ„ νƒμƒ‰(BFS, Breadth First Search)
Β·
Computer Science/Algorithm
λ„ˆλΉ„μš°μ„ νƒμƒ‰(BFS)이번 ν¬μŠ€νŠΈμ—μ„œλŠ” κ·Έλž˜ν”„ 탐색 μ•Œκ³ λ¦¬μ¦˜ 쀑 ν•˜λ‚˜μΈ λ„ˆλΉ„μš°μ„ νƒμƒ‰(BFS)에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.λ„ˆλΉ„μš°μ„ νƒμƒ‰(BFS)μ΄λž€?μ‹œμž‘ μ •μ μ—μ„œ κ°€κΉŒμš΄ 정점뢀터 μ°¨λ‘€λŒ€λ‘œ νƒμƒ‰ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ¦‰, λ¨Όμ € λ°©λ¬Έν•œ μ •μ μ˜ 이웃 λ…Έλ“œλ“€μ„ λͺ¨λ‘ νƒμƒ‰ν•œ λ’€ λ ˆλ²¨λ³„λ‘œ λ„˜μ–΄κ°‘λ‹ˆλ‹€.주둜 같은 κ°€μ€‘μΉ˜λ₯Ό κ°€μ§„ κ·Έλž˜ν”„μ—μ„œ μ΅œλ‹¨κ±°λ¦¬ μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ μ“°μž…λ‹ˆλ‹€.μˆ˜λ„ μ½”λ“œ(Pseudo Code)u: 탐색 μ‹œμž‘ 정점visited[]: 각 μ •μ μ˜ λ°©λ¬Έ μ—¬λΆ€λ₯Ό μ €μž₯ν•˜λŠ” λ°°μ—΄ (쀑볡 λ°©λ¬Έ λ°©μ§€)Q: 탐색할 정점을 μˆœμ„œλŒ€λ‘œ λ‹΄μ•„λ‘λŠ” 큐 (FIFO ꡬ쑰)v: ν˜„μž¬ νμ—μ„œ κΊΌλ‚Έ 정점w: ν˜„μž¬ 정점 v의 인접 정점듀BFS(u): visited[u] ← true // μ‹œμž‘ 정점 u λ°©λ¬Έ ν‘œμ‹œ Q ← e..
[Algorithm][κ·Έλž˜ν”„] κΉŠμ΄μš°μ„ νƒμƒ‰(DFS, Depth First Search)
Β·
Computer Science/Algorithm
κΉŠμ΄μš°μ„ νƒμƒ‰(DFS)이번 ν¬μŠ€νŠΈμ—μ„œλŠ” κ·Έλž˜ν”„ 탐색 μ•Œκ³ λ¦¬μ¦˜ 쀑 ν•˜λ‚˜μΈ κΉŠμ΄μš°μ„ νƒμƒ‰(DFS)에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.κΉŠμ΄μš°μ„ νƒμƒ‰(DFS)μ΄λž€?κ·Έλž˜ν”„μ—μ„œ ν•œ λ°©ν–₯으둜 κ°€λŠ₯ν•œ κΉŠμ΄κΉŒμ§€ 계속 탐색 -> 더 이상 갈 수 μ—†μœΌλ©΄ λ‹€μ‹œ λŒμ•„μ™€μ„œ λ‹€λ₯Έ λ°©ν–₯을 νƒμƒ‰ν•˜λŠ” λ°©μ‹μ˜ κ·Έλž˜ν”„ 순회 μ•Œκ³ λ¦¬μ¦˜μž…λ‹ˆλ‹€.μŠ€νƒ(Stack) 자료ꡬ쑰의 λ™μž‘ 원리(LIFO)λ₯Ό λ”°λ¦…λ‹ˆλ‹€. -> μž¬κ·€ ν•¨μˆ˜ λ˜λŠ” λͺ…μ‹œμ  μŠ€νƒμœΌλ‘œλ„ κ΅¬ν˜„ κ°€λŠ₯μˆ˜λ„ μ½”λ“œ(Pseudo Code)u: ν˜„μž¬ 탐색 쀑인 정점v: u의 μΈμ ‘ν•œ 정점adj[u]: 정점 u에 μΈμ ‘ν•œ λͺ¨λ“  μ •μ λ“€μ˜ 리슀트visited: 각 μ •μ μ˜ λ°©λ¬Έ μ—¬λΆ€λ₯Ό κΈ°λ‘ν•˜λŠ” λ°°μ—΄ λ˜λŠ” μ§‘ν•©DFS(u): visited[u] ← true // μ‹œμž‘ 정점 u λ°©λ¬Έ ν‘œμ‹œ u 처리 ..
[Algorithm][κ·Έλž˜ν”„] 이둠 기초(κ·Έλž˜ν”„, 이진 트리, 인접행렬, μΈμ ‘λ¦¬μŠ€νŠΈ)
Β·
Computer Science/Algorithm
κ·Έλž˜ν”„ 이둠 기초이번 ν¬μŠ€νŠΈμ—μ„œλŠ” κ·Έλž˜ν”„ μ•Œκ³ λ¦¬μ¦˜μ„ 배우기 μ•žμ„œ κ·Έλž˜ν”„ 이둠 κΈ°μ΄ˆμ— λŒ€ν•΄μ„œ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.κ·Έλž˜ν”„(Graph)λž€?정점(Vertex)κ³Ό κ°„μ„ (Edge)으둜 이루어진 μžλ£Œκ΅¬μ‘°μ •μ μ€ 데이터λ₯Ό, 간선은 정점 κ°„μ˜ 관계λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.예λ₯Ό λ“€μ–΄, λ„μ‹œ κ°„ λ„λ‘œ μ—°κ²°, μ‚¬λžŒ κ°„ 관계, λ„€νŠΈμ›Œν¬ ꡬ쑰 λ“± ν˜„μ‹€ μ„Έκ³„μ˜ λ§Žμ€ ꡬ쑰λ₯Ό κ·Έλž˜ν”„λ‘œ λͺ¨λΈλ§ν•  수 μžˆμŠ΅λ‹ˆλ‹€.κ·Έλž˜ν”„μ˜ μ’…λ₯˜κ·Έλž˜ν”„λŠ” λ‹€μ–‘ν•œ 기쀀에 따라 μ—¬λŸ¬ μ’…λ₯˜λ‘œ λ‚˜λ‰©λ‹ˆλ‹€.ꡬ뢄쒅λ₯˜μ„€λͺ…λ°©ν–₯μ„±λ°©ν–₯ κ·Έλž˜ν”„κ°„μ„ μ— λ°©ν–₯이 μžˆλŠ” κ·Έλž˜ν”„ (A → B) 무방ν–₯ κ·Έλž˜ν”„κ°„μ„ μ— λ°©ν–₯이 μ—†λŠ” κ·Έλž˜ν”„ (A — B)μˆœν™˜μ„±μˆœν™˜ κ·Έλž˜ν”„μ •μ μ—μ„œ μΆœλ°œν•΄ λ‹€μ‹œ λŒμ•„μ˜€λŠ” κ²½λ‘œκ°€ 쑴재 λΉ„μˆœν™˜ κ·Έλž˜ν”„(DAG)μˆœν™˜μ΄ μ—†λŠ” λ°©ν–₯ κ·Έλž˜ν”„κ°€μ€‘μΉ˜κ°€μ€‘μΉ˜ κ·Έλž˜ν”„κ°„μ„ μ— λΉ„μš© λ˜λŠ” 길이 λ“±μ˜ 값이 μžˆλŠ” κ·Έλž˜ν”„μ—°..
[Algorithm][μ„±λŠ₯뢄석] κ³΅κ°„λ³΅μž‘λ„(Space Complexity)
Β·
Computer Science/Algorithm
κ³΅κ°„λ³΅μž‘λ„μ΄λ²ˆ ν¬μŠ€νŠΈμ—μ„œλŠ” μ•Œκ³ λ¦¬μ¦˜ μ„±λŠ₯ 뢄석 방법 쀑 ν•˜λ‚˜μΈ κ³΅κ°„λ³΅μž‘λ„μ— λŒ€ν•΄μ„œ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.κ³΅κ°„λ³΅μž‘λ„λž€?μž…λ ₯크기에 λŒ€ν•΄ μ–΄λ– ν•œ μ•Œκ³ λ¦¬μ¦˜μ΄ μ‹€ν–‰λ˜λŠ”λ° ν•„μš”ν•œ λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ μ–‘μž…λ ₯ 크기(N)에 따라 μ•Œκ³ λ¦¬μ¦˜μ΄ μ–Όλ§ˆλ‚˜ λ§Žμ€ λ©”λͺ¨λ¦¬λ₯Ό μ‚¬μš©ν•˜λŠ”μ§€λ₯Ό μˆ˜ν•™μ μœΌλ‘œ ν‘œν˜„ν•˜λŠ” κ°œλ…μ •μ λ³€μˆ˜ μ„ μ–Έ 이외에도 λ™μ μœΌλ‘œ ν• λ‹Ήλœ 곡간λ₯Ό ν¬ν•¨ν•˜μ—¬ Array, Map, Set λ“± μš”μ†Œλ“€μ„ 담을 곡간이면 λͺ¨λ‘ μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.κ³΅κ°„λ³΅μž‘λ„μ˜ ν•„μš”μ„±κ³΅κ°„λ³΅μž‘λ„λ₯Ό κ³ λ €ν•˜λŠ” 것은 효율적인 μ•Œκ³ λ¦¬μ¦˜ 섀계와 μ‹œμŠ€ν…œ μ•ˆμ •μ„± 확보λ₯Ό μœ„ν•΄ 맀우 μ€‘μš”ν•©λ‹ˆλ‹€.컴퓨터 μ‹œμŠ€ν…œμ—λŠ” ν•œμ •λœ λ©”λͺ¨λ¦¬ μžμ›μ΄ μ‘΄μž¬ν•©λ‹ˆλ‹€.특히 μ„œλ²„, μž„λ² λ””λ“œ μ‹œμŠ€ν…œ, λͺ¨λ°”일 ν™˜κ²½μ²˜λŸΌ λ©”λͺ¨λ¦¬κ°€ μ œν•œλœ ν™˜κ²½μ—μ„œλŠ” κ³΅κ°„λ³΅μž‘λ„λ₯Ό κ³ λ €ν•˜μ§€ μ•ŠμœΌλ©΄ ν”„λ‘œκ·Έλž¨μ΄ λ©”λͺ¨λ¦¬ 초과(Memory Limi..
[Algorithm][μ„±λŠ₯뢄석] μ‹œκ°„λ³΅μž‘λ„(Time Complexity)
Β·
Computer Science/Algorithm
μ‹œκ°„λ³΅μž‘λ„μ΄λ²ˆ ν¬μŠ€νŠΈμ—μ„œλŠ” μ•Œκ³ λ¦¬μ¦˜ μ„±λŠ₯ 뢄석 방법 쀑 ν•˜λ‚˜μΈ μ‹œκ°„λ³΅μž‘λ„μ— λŒ€ν•΄μ„œ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.μ‹œκ°„λ³΅μž‘λ„λž€?μž…λ ₯크기에 λŒ€ν•΄ μ–΄λ– ν•œ μ•Œκ³ λ¦¬μ¦˜μ΄ μ‹€ν–‰λ˜λŠ”λ° κ±Έλ¦¬λŠ” μ‹œκ°„μ£Όμš”λ‘œμ§μ˜ 반볡횟수λ₯Ό μ€‘μ μœΌλ‘œ μΈ‘μ •λ©λ‹ˆλ‹€.μž…λ ₯이 컀질수둝 μ‹€ν–‰ μ‹œκ°„μ΄ μ–΄λ–»κ²Œ λŠ˜μ–΄λ‚˜λŠ”μ§€λ₯Ό μˆ˜ν•™μ μœΌλ‘œ ν‘œν˜„ν•˜λ©° 주둜 O(λΉ…μ˜€ ν‘œκΈ°λ²•)을 μ‚¬μš©ν•΄μ„œ λ‚˜νƒ€λƒ…λ‹ˆλ‹€. μ‹œκ°„λ³΅μž‘λ„κ°€ μ‘΄μž¬ν•˜λŠ” μ΄μœ λŠ”?효율적인 μ½”λ“œλ‘œ κ°œμ„ ν•˜λŠ”λ° μ“°μ΄λŠ” 척도가 되기 λ•Œλ¬Έμž…λ‹ˆλ‹€. μ½”λ”© ν…ŒμŠ€νŠΈλ‚˜ μ‹€μ œ 개발 ν˜„μž₯μ—μ„œλŠ” 정닡을 λΉ λ₯΄κ³  효율적으둜 κ΅¬ν•˜λŠ” 것이 더 μ€‘μš”ν•©λ‹ˆλ‹€.아무리 문제λ₯Ό ν’€μ–΄λƒˆλ‹€κ³  해도 μž…λ ₯이 쑰금만 컀지면 μ‹œκ°„μ΄ ν„°μ Έλ²„λ¦°λ‹€κ±°λ‚˜ μ„œλ²„λ‚˜ ν”„λ‘œκ·Έλž¨μ΄ λ©ˆμΆ”λŠ” 상황이 λ°œμƒν•˜λ©΄ κ·Έ μ½”λ“œλŠ” μ‹€μ§ˆμ μœΌλ‘œ μ‚¬μš©ν•  수 μ—†λŠ” μ½”λ“œκ°€ λ©λ‹ˆλ‹€. ❓ κ·Έλ ‡λ‹€λ©΄ μ‹œκ°„λ³΅μž‘λ„λ₯Ό μΈ‘μ •ν•˜κΈ° μœ„ν•΄μ„œ 항상 μ‹œ..
[Algorithm][완전탐색] μˆœμ—΄κ³Ό μ‘°ν•©(Permutation & Combination)
Β·
Computer Science/Algorithm
μˆœμ—΄κ³Ό μ‘°ν•©μ΄λ²ˆ ν¬μŠ€νŠΈμ—μ„œλŠ” 완전탐색 μ’…λ₯˜ 쀑 ν•˜λ‚˜μΈ μˆœμ—΄κ³Ό 쑰합에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.μˆœμ—΄μ΄λž€?μˆœμ„œλ₯Ό κ³ λ €ν•΄μ„œ n개 쀑 r개λ₯Ό λ½‘λŠ” κ²½μš°κ³΅μ‹μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. $$ nPr = n! / (n-r)! $$μ˜ˆμ‹œ[A, B, C] μ€‘μ—μ„œ 2개λ₯Ό 뽑아 쀄을 μ„Έμš΄λ‹€λ©΄:(A, B), (A, C), (B, A), (B, C), (C, A), (C, B) -> 총 6κ°€μ§€ κ²½μš°μˆœμ„œλ₯Ό κ³ λ €ν•˜κΈ° λ•Œλ¬Έμ— (A, B)와 (B, A)λŠ” μ„œλ‘œ λ‹€λ₯Έ κ²½μš°μž…λ‹ˆλ‹€. μ‘°ν•©μ΄λž€?μˆœμ„œλ₯Ό κ³ λ €ν•˜μ§€ μ•Šκ³  n개 쀑 r개λ₯Ό λ½‘λŠ” κ²½μš°κ³΅μ‹μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. $$ nCr = n! / r!(n-r)! $$μ˜ˆμ‹œ[A, B, C] 쀑 2개λ₯Ό λ½‘λŠ”λ‹€λ©΄:(A, B), (A, C), (B, C) -> 총 3κ°€μ§€ κ²½μš°μˆœμ„œλ₯Ό κ³ λ €ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— (A, B)와 ..