728x90
λ°˜μ‘ν˜•

μ•Œκ³ λ¦¬μ¦˜ 11

[μ•Œκ³ λ¦¬μ¦˜] 크루슀칼 μ•Œκ³ λ¦¬μ¦˜ (Kruskal Algorithm)

μ‹ μž₯ 트리 (Spanning Tree) κ·Έλž˜ν”„μ—μ„œ λͺ¨λ“  λ…Έλ“œλ₯Ό ν¬ν•¨ν•˜λ©΄μ„œ 사이클이 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” λΆ€λΆ„ κ·Έλž˜ν”„λ₯Ό μ˜λ―Έν•œλ‹€. λͺ¨λ“  λ…Έλ“œκ°€ ν¬ν•¨λ˜μ–΄ μ„œλ‘œ μ—°κ²°λ˜λ©΄μ„œ 사이클이 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 쑰건은 트리의 쑰건이기도 ν•˜λ‹€. μ‹ μž₯ 트리 μ‚¬μš© λͺ©μ  λͺ¨λ“  λ…Έλ“œκ°€ μ—°κ²°λ˜μ–΄ μžˆμ§€λ§Œ 일뢀 간선을 μ‚¬μš©ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€λŠ” μ μ—μ„œ μ‹€μ œ 문제 μƒν™©μ—μ„œ 효과적으둜 μ‚¬μš©λ  수 μžˆλ‹€. μ΅œμ†Œ μ‹ μž₯ 트리 (MST, Minimum Spanning Tree) μ΅œμ†Œν•œμ˜ λΉ„μš©μœΌλ‘œ κ΅¬μ„±λ˜λŠ” μ‹ μž₯ 트리λ₯Ό μ°Ύμ•„μ•Ό ν•  λ•Œ μ–΄λ–»κ²Œ ν•΄μ•Ό ν• κΉŒμš”? 예λ₯Ό λ“€μ–΄ N개의 λ„μ‹œκ°€ μ‘΄μž¬ν•˜λŠ” μƒν™©μ—μ„œ 두 λ„μ‹œ 사이에 λ„λ‘œλ₯Ό 놓아 전체 λ„μ‹œκ°€ μ„œλ‘œ 연결될 수 있게 λ„λ‘œλ₯Ό μ„€μΉ˜ν•˜λŠ” 경우λ₯Ό 생각해 λ΄…μ‹œλ‹€. 두 λ„μ‹œ A, Bλ₯Ό μ„ νƒν–ˆμ„ λ•Œ Aμ—μ„œ B둜 μ΄λ™ν•˜λŠ” κ²½λ‘œκ°€ λ°˜λ“œ..

Algorithm 2023.12.14

[μ•Œκ³ λ¦¬μ¦˜] μ„œλ‘œμ†Œ 집합 (Disjoint Sets) - 사이클 νŒλ³„

μ„œλ‘œμ†Œ 집합을 ν™œμš©ν•œ 사이클 νŒλ³„ μ„œλ‘œμ†Œ 집합은 무방ν–₯ κ·Έλž˜ν”„ λ‚΄μ—μ„œμ˜ 사이클을 νŒλ³„ν•  λ•Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 참고둜 λ°©ν–₯ κ·Έλž˜ν”„μ—μ„œμ˜ 사이클 μ—¬λΆ€λŠ” DFSλ₯Ό μ΄μš©ν•˜μ—¬ νŒλ³„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 1. 사이클 νŒλ³„ μ•Œκ³ λ¦¬μ¦˜ 각 간선을 ν•˜λ‚˜μ”© ν™•μΈν•˜λ©° 두 λ…Έλ“œμ˜ 루트 λ…Έλ“œλ₯Ό ν™•μΈν•©λ‹ˆλ‹€. 루트 λ…Έλ“œκ°€ μ„œλ‘œ λ‹€λ₯΄λ‹€λ©΄ 두 λ…Έλ“œμ— λŒ€ν•˜μ—¬ 합집합(Union) 연산을 μˆ˜ν–‰ν•©λ‹ˆλ‹€. 루트 λ…Έλ“œκ°€ μ„œλ‘œ κ°™λ‹€λ©΄ 사이클(Cycle)이 λ°œμƒν•œ κ²ƒμž…λ‹ˆλ‹€. κ·Έλž˜ν”„μ— ν¬ν•¨λ˜μ–΄ μžˆλŠ” λͺ¨λ“  간선에 λŒ€ν•˜μ—¬ 1번 과정을 λ°˜λ³΅ν•©λ‹ˆλ‹€. 2. λ™μž‘ κ³Όμ • μ‚΄νŽ΄λ³΄κΈ° 3. μ„œλ‘œμ†Œ 집합을 ν™œμš©ν•œ 사이클 νŒλ³„ (μ½”λ“œ) 1) μ„œλ‘œμ†Œ 집합을 ν™œμš©ν•œ 사이클 νŒλ³„ (Python) # νŠΉμ • μ›μ†Œκ°€ μ†ν•œ 집합을 μ°ΎκΈ° def find_parent(parent, x): #..

Algorithm 2023.12.10

[μ•Œκ³ λ¦¬μ¦˜] μ„œλ‘œμ†Œ 집합 (Disjoint Sets) - 자료ꡬ쑰

κ·Έλž˜ν”„ κ·Έλž˜ν”„(Graph)λž€ λ…Έλ“œμ™€ λ…Έλ“œ 사이에 μ—°κ²°λœ κ°„μ„ μ˜ 정보λ₯Ό 가지고 μžˆλŠ” 자료ꡬ쑰λ₯Ό μ˜λ―Έν•œλ‹€. μ„œλ‘œμ†Œ 집합 μ„œλ‘œμ†Œ 집합(Disjoint Sets)μ΄λž€ 곡톡 μ›μ†Œκ°€ μ—†λŠ” 두 집합을 μ˜λ―Έν•œλ‹€. μ„œλ‘œμ†Œ 집합 자료ꡬ쑰 μ„œλ‘œμ†Œ λΆ€λΆ„ μ§‘ν•©λ“€λ‘œ λ‚˜λˆ„μ–΄μ§„ μ›μ†Œλ“€μ˜ 데이터λ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ μžλ£Œκ΅¬μ‘°μ΄λ‹€. μ„œλ‘œμ†Œ 집합 μžλ£Œκ΅¬μ‘°λŠ” 두 μ’…λ₯˜μ˜ 연산을 μ§€μ›ν•œλ‹€. 합집합(Union): 두 개의 μ›μ†Œκ°€ ν¬ν•¨λœ 집합을 ν•˜λ‚˜μ˜ μ§‘ν•©μœΌλ‘œ ν•©μΉ˜λŠ” 연산이닀. μ°ΎκΈ°(Find): νŠΉμ •ν•œ μ›μ†Œκ°€ μ†ν•œ 집합이 μ–΄λ–€ 집합인지 μ•Œλ €μ£ΌλŠ” 연산이닀. μ„œλ‘œμ†Œ 집합 μžλ£Œκ΅¬μ‘°λŠ” ν•©μΉ˜κΈ° μ°ΎκΈ°(Union Find) 자료ꡬ쑰라고 λΆˆλ¦¬κΈ°λ„ ν•œλ‹€. 1. μ—¬λŸ¬ 개의 ν•©μΉ˜κΈ° 연산이 μ£Όμ–΄μ‘Œμ„ λ•Œ μ„œλ‘œμ†Œ 집합 자료ꡬ쑰의 λ™μž‘ κ³Όμ • 합집합(Union) 연산을 ν™•μΈν•˜μ—¬,..

Algorithm 2023.12.09

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] μž…κ΅­μ‹¬μ‚¬ (파이썬)

λ‚œμ΄λ„ : Lv. 3 https://school.programmers.co.kr/learn/courses/30/lessons/43238 ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ μ½”λ“œ μ€‘μ‹¬μ˜ 개발자 μ±„μš©. μŠ€νƒ 기반의 ν¬μ§€μ…˜ 맀칭. ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€μ˜ 개발자 λ§žμΆ€ν˜• ν”„λ‘œν•„μ„ λ“±λ‘ν•˜κ³ , λ‚˜μ™€ 기술 ꢁ합이 잘 λ§žλŠ” 기업듀을 맀칭 λ°›μœΌμ„Έμš”. programmers.co.kr πŸ“„ 문제 nλͺ…이 μž…κ΅­μ‹¬μ‚¬λ₯Ό μœ„ν•΄ 쀄을 μ„œμ„œ 기닀리고 μžˆμŠ΅λ‹ˆλ‹€. 각 μž…κ΅­μ‹¬μ‚¬λŒ€μ— μžˆλŠ” μ‹¬μ‚¬κ΄€λ§ˆλ‹€ μ‹¬μ‚¬ν•˜λŠ” 데 κ±Έλ¦¬λŠ” μ‹œκ°„μ€ λ‹€λ¦…λ‹ˆλ‹€. μ²˜μŒμ— λͺ¨λ“  μ‹¬μ‚¬λŒ€λŠ” λΉ„μ–΄μžˆμŠ΅λ‹ˆλ‹€. ν•œ μ‹¬μ‚¬λŒ€μ—μ„œλŠ” λ™μ‹œμ— ν•œ λͺ…λ§Œ 심사λ₯Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€. κ°€μž₯ μ•žμ— μ„œ μžˆλŠ” μ‚¬λžŒμ€ λΉ„μ–΄ μžˆλŠ” μ‹¬μ‚¬λŒ€λ‘œ κ°€μ„œ 심사λ₯Ό 받을 수 μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ 더 빨리 λλ‚˜λŠ” μ‹¬μ‚¬λŒ€κ°€ 있으면 κΈ°λ‹€λ Έλ‹€κ°€ 그곳으둜 κ°€μ„œ 심사λ₯Ό λ°›..

[μ•Œκ³ λ¦¬μ¦˜] 졜μž₯ 증가 λΆ€λΆ„ μˆ˜μ—΄(LIS) μ•Œκ³ λ¦¬μ¦˜

졜μž₯ 증가 λΆ€λΆ„ μˆ˜μ—΄(Longest Increasing Subsequence)μ΄λž€? μ›μ†Œκ°œ n개인 λ°°μ—΄μ˜ 일뢀 μ›μ†Œλ₯Ό κ³¨λΌλ‚΄μ„œ λ§Œλ“  λΆ€λΆ„ μˆ˜μ—΄ 쀑, 각 μ›μ†Œκ°€ 이전 μ›μ†Œλ³΄λ‹€ ν¬λ‹€λŠ” 쑰건을 λ§Œμ‘±ν•˜κ³ , κ·Έ 길이가 μ΅œλŒ€μΈ λΆ€λΆ„ μˆ˜μ—΄μ„ 졜μž₯ 증가 λΆ€λΆ„ μˆ˜μ—΄μ΄λΌκ³  ν•œλ‹€. κ°„λ‹¨νžˆ 말해, κ°€μž₯ κΈ΄ μ¦κ°€ν•˜λŠ” λΆ€λΆ„ μˆ˜μ—΄μ΄λ‹€. μ˜ˆμ‹œ [6, 2, 5, 1, 7, 4, 8, 3] μ΄λΌλŠ” λ°°μ—΄μ—μ„œ 졜μž₯ 증가 λΆ€λΆ„ μˆ˜μ—΄(LIS)은 [2, 5, 7, 8]이 λœλ‹€. [2, 5, 7], [2, 4, 8] λ“± μ¦κ°€ν•˜λŠ” λΆ€λΆ„ μˆ˜μ—΄μ€ λ§Žμ§€λ§Œ κ·Έ μ€‘μ—μ„œ κ°€μž₯ κΈ΄ 것은 [2, 5, 7, 8]이닀. 졜μž₯ 증가 λΆ€λΆ„ μˆ˜μ—΄ μ•Œκ³ λ¦¬μ¦˜ 풀이 방법 졜μž₯ 증가 λΆ€λΆ„ μˆ˜μ—΄μ˜ 길이λ₯Ό ꡬ할 수 μžˆλŠ” 풀이 방법은 크게 2가지가 μžˆλ‹€. λ™μ κ³„νšλ²• (DP, Dyna..

Algorithm 2023.09.01

[λ°±μ€€] 12015 κ°€μž₯ κΈ΄ μ¦κ°€ν•˜λŠ” λΆ€λΆ„ μˆ˜μ—΄ 2 (파이썬)

κ³¨λ“œ β…‘ https://www.acmicpc.net/problem/12015 12015번: κ°€μž₯ κΈ΄ μ¦κ°€ν•˜λŠ” λΆ€λΆ„ μˆ˜μ—΄ 2 첫째 쀄에 μˆ˜μ—΄ A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진닀. λ‘˜μ§Έ μ€„μ—λŠ” μˆ˜μ—΄ Aλ₯Ό 이루고 μžˆλŠ” Aiκ°€ 주어진닀. (1 ≤ Ai ≤ 1,000,000) www.acmicpc.net πŸ“„ 문제 μˆ˜μ—΄ Aκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, κ°€μž₯ κΈ΄ μ¦κ°€ν•˜λŠ” λΆ€λΆ„ μˆ˜μ—΄μ„ κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€. μˆ˜μ—΄ A의 ν¬κΈ°λŠ” N (1 ≤ N ≤ 1,000,000)이닀. 예λ₯Ό λ“€μ–΄, μˆ˜μ—΄ A = {10, 20, 10, 30, 20, 50}인 κ²½μš°μ— κ°€μž₯ κΈ΄ μ¦κ°€ν•˜λŠ” λΆ€λΆ„ μˆ˜μ—΄μ€ A = {10, 20, 10, 30, 20, 50}이고, κΈΈμ΄λŠ” 4이닀. πŸ’‘ 아이디어 졜μž₯ 증가 λΆ€λΆ„ μˆ˜μ—΄(LIS, Long..

[λ°±μ€€] 2470 두 μš©μ•‘ (파이썬)

κ³¨λ“œ β…€ https://www.acmicpc.net/problem/2470 2470번: 두 μš©μ•‘ 첫째 μ€„μ—λŠ” 전체 μš©μ•‘μ˜ 수 N이 μž…λ ₯λœλ‹€. N은 2 이상 100,000 μ΄ν•˜μ΄λ‹€. λ‘˜μ§Έ μ€„μ—λŠ” μš©μ•‘μ˜ νŠΉμ„±κ°’μ„ λ‚˜νƒ€λ‚΄λŠ” N개의 μ •μˆ˜κ°€ λΉˆμΉΈμ„ 사이에 두고 주어진닀. 이 μˆ˜λ“€μ€ λͺ¨λ‘ -1,000,000,000 이상 1,000,00 www.acmicpc.net πŸ“„ 문제 KOI λΆ€μ„€ κ³Όν•™μ—°κ΅¬μ†Œμ—μ„œλŠ” λ§Žμ€ μ’…λ₯˜μ˜ μ‚°μ„± μš©μ•‘κ³Ό μ•ŒμΉΌλ¦¬μ„± μš©μ•‘μ„ λ³΄μœ ν•˜κ³  μžˆλ‹€. μ‚°μ„± μš©μ•‘μ˜ νŠΉμ„±κ°’μ€ 1λΆ€ν„° 1,000,000,000κΉŒμ§€μ˜ μ–‘μ˜ μ •μˆ˜λ‘œ λ‚˜νƒ€λ‚΄κ³ , μ•ŒμΉΌλ¦¬μ„± μš©μ•‘μ˜ νŠΉμ„±κ°’μ€ -1λΆ€ν„° -1,000,000,000κΉŒμ§€μ˜ 음의 μ •μˆ˜λ‘œ λ‚˜νƒ€λ‚Έλ‹€. 같은 μ–‘μ˜ 두 μš©μ•‘μ„ ν˜Όν•©ν•œ μš©μ•‘μ˜ νŠΉμ„±κ°’μ€ ν˜Όν•©μ— μ‚¬μš©λœ 각 μš©μ•‘μ˜ νŠΉμ„±κ°’μ˜ ν•©μœΌλ‘œ μ •μ˜..

[λ°±μ€€] 14890 κ²½μ‚¬λ‘œ (파이썬)

κ³¨λ“œ β…’ https://www.acmicpc.net/problem/14890 14890번: κ²½μ‚¬λ‘œ 첫째 쀄에 N (2 ≤ N ≤ 100)κ³Ό L (1 ≤ L ≤ N)이 주어진닀. λ‘˜μ§Έ 쀄뢀터 N개의 쀄에 지도가 주어진닀. 각 칸의 λ†’μ΄λŠ” 10보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄λ‹€. www.acmicpc.net πŸ“„ 문제 크기가 N×N인 지도가 μžˆλ‹€. μ§€λ„μ˜ 각 μΉΈμ—λŠ” 그곳의 높이가 μ ν˜€ μžˆλ‹€. μ˜€λŠ˜μ€ 이 μ§€λ„μ—μ„œ μ§€λ‚˜κ°ˆ 수 μžˆλŠ” 길이 λͺ‡ 개 μžˆλŠ”μ§€ μ•Œμ•„λ³΄λ €κ³  ν•œλ‹€. κΈΈμ΄λž€ ν•œ ν–‰ λ˜λŠ” ν•œ μ—΄ μ „λΆ€λ₯Ό λ‚˜νƒ€λ‚΄λ©°, ν•œμͺ½ λμ—μ„œ λ‹€λ₯Έ μͺ½ λκΉŒμ§€ μ§€λ‚˜κ°€λŠ” 것이닀. 길을 μ§€λ‚˜κ°ˆ 수 있으렀면 길에 μ†ν•œ λͺ¨λ“  칸의 높이가 λͺ¨λ‘ κ°™μ•„μ•Ό ν•œλ‹€. λ˜λŠ”, κ²½μ‚¬λ‘œλ₯Ό λ†“μ•„μ„œ μ§€λ‚˜κ°ˆ 수 μžˆλŠ” 길을 λ§Œλ“€ 수 μžˆλ‹€. κ²½μ‚¬λ‘œλŠ” 높이가 항상 1이며, ..

[μ•Œκ³ λ¦¬μ¦˜] μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체 (μ†Œμˆ˜ νŒλ³„)

μ†Œμˆ˜ (Prime Number) 1보닀 큰 μžμ—°μˆ˜ μ€‘μ—μ„œ 1κ³Ό 자기 μžμ‹ μ„ μ œμ™Έν•œ μžμ—°μˆ˜λ‘œλŠ” λ‚˜λˆ„μ–΄ 떨어지지 μ•ŠλŠ” μžμ—°μˆ˜ 6은 1, 2, 3, 6으둜 λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€λ―€λ‘œ μ†Œμˆ˜κ°€ μ•„λ‹ˆλ‹€. 7은 1κ³Ό 7을 μ œμ™Έν•˜κ³ λŠ” λ‚˜λˆ„μ–΄ 떨어지지 μ•ŠμœΌλ―€λ‘œ μ†Œμˆ˜μ΄λ‹€. μ†Œμˆ˜μ˜ νŒλ³„: 기본적인 μ•Œκ³ λ¦¬μ¦˜ 1. 기본적인 μ•Œκ³ λ¦¬μ¦˜ μ†ŒμŠ€ μ½”λ“œ- 파이썬 (Python) # μ†Œμˆ˜ νŒλ³„ ν•¨μˆ˜ (2μ΄μƒμ˜ μžμ—°μˆ˜μ— λŒ€ν•˜μ—¬) def is_prime_number(x): # 2λΆ€ν„° (x - 1)κΉŒμ§€μ˜ λͺ¨λ“  수λ₯Ό ν™•μΈν•˜λ©° for i in range(2, x): # xκ°€ ν•΄λ‹Ή 수둜 λ‚˜λˆ„μ–΄ 떨어진닀면 if x % i == 0: return False # μ†Œμˆ˜κ°€ μ•„λ‹ˆλ‹€. # λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€λŠ” μˆ˜κ°€ ν•˜λ‚˜λ„ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ return True # μ†Œμˆ˜μ΄λ‹€. ..

Algorithm 2023.08.25

[μ•Œκ³ λ¦¬μ¦˜] 이진 탐색 / 이뢄 탐색 (Binary Search)

이진 탐색은 μ •λ ¬λœ λ¦¬μŠ€νŠΈμ— μ μš©ν•  수 μžˆλŠ” κ°„λ‹¨ν•œ 고속 탐색 기법이며, 이뢄 탐색이라고도 λΆˆλ¦°λ‹€. 순차 탐색 리슀트 μ•ˆμ— μžˆλŠ” νŠΉμ •ν•œ 데이터λ₯Ό μ°ΎκΈ° μœ„ν•΄ μ•žμ—μ„œλΆ€ν„° 데이터λ₯Ό ν•˜λ‚˜μ”© ν™•μΈν•˜λŠ” 방법이닀. 이진 탐색 μ •λ ¬λ˜μ–΄ μžˆλŠ” λ¦¬μŠ€νŠΈμ—μ„œ 탐색 λ²”μœ„λ₯Ό μ ˆλ°˜μ”© μ’ν˜€κ°€λ©° 데이터λ₯Ό νƒμƒ‰ν•˜λŠ” 방법이닀. 이진 탐색은 μ‹œμž‘μ , 끝점, 쀑간점을 μ΄μš©ν•˜μ—¬ 탐색 λ²”μœ„λ₯Ό μ„€μ •ν•œλ‹€. 이진 탐색 (이뢄 탐색) μ•Œκ³ λ¦¬μ¦˜ μ •λ ¬λ˜μ–΄ μžˆλŠ” λ¦¬μŠ€νŠΈμ—μ„œ 탐색 λ²”μœ„λ₯Ό μ ˆλ°˜μ”© μ’ν˜€κ°€λ©° 데이터λ₯Ό νƒμƒ‰ν•˜λŠ” 방법이닀. λ°°μ—΄ λ‚΄λΆ€μ˜ 데이터가 μ •λ ¬λ˜μ–΄ μžˆμ–΄μ•Όλ§Œ μ‚¬μš©ν•  수 μžˆλŠ” μ•Œκ³ λ¦¬μ¦˜μ΄λ‹€. μ‹œμž‘μ , 끝점, 쀑간점(start, end, mid) λ³€μˆ˜ 3개λ₯Ό μ‚¬μš©ν•˜μ—¬ νƒμƒ‰ν•œλ‹€. μ°ΎμœΌλ €λŠ” 데이터와 쀑간점 μœ„μΉ˜μ— μžˆλŠ” 데이터λ₯Ό 반볡적으둜 λΉ„κ΅ν•΄μ„œ μ›ν•˜λŠ” 데..

Algorithm 2023.08.17
728x90
λ°˜μ‘ν˜•