๐Ÿ–ฅ CS/Algorithm

    [Algorithm] ํž™ | ์ตœ๋Œ€ ํž™, ์ตœ์†Œ ํž™

    heap์ด๋ž€? : ์šฐ์„  ์ˆœ์œ„ ํ(priority queue)๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ ์ค‘ ํ•˜๋‚˜๋กœ, ์™„์ „์ด์ง„ํŠธ๋ฆฌ๋ฅผ base๋กœ ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ. ์šฐ์„ ์ˆœ์œ„ ํ๋Š” ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์žฅ ๋จผ์ € ์‚ญ์ œํ•˜๋Š” ์ ์ด ํŠน์ง• ์ตœ์†Œ ํž™: ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’์ด ์ž์‹ ๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’๋ณด๋‹ค ํ•ญ์ƒ ์ž‘์€ ํž™ ์ตœ๋Œ€ ํž™: ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’์ด ์ž์‹ ๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’๋ณด๋‹ค ํ•ญ์ƒ ํฐ ํž™ ์ž๋ฃŒ๊ตฌ์กฐ ์ถ”์ถœ๋˜๋Š” ๋ฐ์ดํ„ฐ ์Šคํƒ(stack) ๊ฐ€์žฅ ๋‚˜์ค‘์— ์‚ฝ์ž…๋œ ๋ฐ์ดํ„ฐ ํ(queue) ๊ฐ€์žฅ ๋จผ์ € ์‚ฝ์ž…๋œ ๋ฐ์ดํ„ฐ ์šฐ์„ ์ˆœ์œ„ ํ(priority queue) ๊ฐ€์žฅ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋†’์€ ๋ฐ์ดํ„ฐ ์ตœ์†Œ ํž™ (min heap) : ๊ฐ’์ด ๊ฐ€์žฅ ๋‚ฎ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋จผ์ € ์‚ญ์ œ import heapq heap = [] heapq.heappush(heap, 5) heapq.heap..

    [Algorithm] DFS & BFS | ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰

    โ€ปํƒ์ƒ‰: ๋งŽ์€ ๋ฐ์ดํ„ฐ์—์„œ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š” ๊ณผ์ • ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰์„ ์œ„ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ (1) ์Šคํƒ (2) ํ (3) ์žฌ๊ท€ํ•จ์ˆ˜ (4) ๊ทธ๋ž˜ํ”„ DFS | ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰ : ๊นŠ์€ ๋ถ€๋ถ„์„ ์šฐ์„ ์ ์œผ๋กœ ํƒ์ƒ‰ ๐Ÿ‘‰ ํŠน์ • ๊ฒฝ๋กœ๋กœ ํƒ์ƒ‰ํ•˜๋‹ค๊ฐ€ ํŠน์ • ์ƒํ™ฉ์—์„œ ์ตœ๋Œ€ํ•œ ๊นŠ์ˆ™์ด ๋“ค์–ด๊ฐ€์„œ ๋…ธ๋“œ ๋ฐฉ๋ฌธ ํ›„ ๋‹ค์‹œ ๋Œ์•„๊ฐ€ ๋‹ค๋ฅธ ๋…ธ๋“œ ๋ฐฉ๋ฌธ (1) ํƒ์ƒ‰ ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ์Šคํƒ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ โ€ป ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ: ์Šคํƒ์— ํ•œ๋ฒˆ ์‚ฝ์ž…๋˜์–ด ์ฒ˜๋ฆฌ๋œ ๋…ธ๋“œ๊ฐ€ ๋‹ค์‹œ ์‚ฝ์ž…๋˜์ง€ ์•Š๊ฒŒ check (2) ์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ์— ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ทธ ์ธ์ ‘ ๋…ธ๋“œ๋ฅผ ์Šคํƒ์— pushํ•˜๊ณ  ๋‹ค์‹œ ๋Œ์•„๊ฐ€ ๋‹ค๋ฅธ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•œ๋‹ค. (3) (2) ๊ณผ์ •์„ ๋ฐ˜๋ณต ์ˆ˜ํ–‰ํ•œ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋…ธ๋“œ์˜ ํƒ์ƒ‰ ์ˆœ์„œ๋Š” ์Šคํƒ์— ๋“ค์–ด๊ฐ„ ์ˆœ์„œ์™€ ๊ฐ™๋‹ค. 1 → 2 → 5 →6 → 3 → 7 → 4 → 8 ์ฒซ ..

    [Algorithm] ์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์˜ ์ฒด | ์†Œ์ˆ˜ ์ฐพ๊ธฐ

    ์†Œ์ˆ˜๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ธ ์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์˜ ์ฒด์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž ์›๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ๐Ÿ’ก 0๋ถ€ํ„ฐ ๊ตฌํ•˜๊ณ ์žํ•˜๋Š” ์ˆ˜(n)๊นŒ์ง€ True๋กœ ์ฑ„์šด ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ๐Ÿ’ก 2๋ฅผ ์ œ์™ธํ•œ 2์˜ ๋ฐฐ์ˆ˜๋ฅผ False๋กœ ๋ฐ”๊พผ๋‹ค. ๐Ÿ’ก 3์„ ์ œ์™ธํ•œ 3์˜ ๋ฐฐ์ˆ˜๋ฅผ False๋กœ ๋ฐ”๊พผ๋‹ค. ๐Ÿ’ก 5๋ฅผ ์ œ์™ธํ•œ 5์˜ ๋ฐฐ์ˆ˜๋ฅผ False๋กœ ๋ฐ”๊พผ๋‹ค. . . . ๐Ÿ’กn์˜ ์ตœ๋Œ€ ์•ฝ์ˆ˜๋Š” sqrt(n) ์ดํ•˜์ด๋ฏ€๋กœ sqrt(n)์˜ ๋ฐฐ์ˆ˜๋ฅผ ๋ชจ๋‘ False๋กœ ๋ฐ”๊พผ๋‹ค. ๐Ÿ’ก2~n๊นŒ์ง€์˜ ์ˆซ์ž ์ค‘ True์ธ ์ˆซ์ž๋“ค์ด ์†Œ์ˆ˜๊ฐ€ ๋œ๋‹ค. ์ด๋ฅผ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. def isPrime(n): sieve = [True] * n # n์˜ ์ตœ๋Œ€ ์•ฝ์ˆ˜๋Š” sqrt(n) ์ดํ•˜ m = int(n ** 0.5) for i in range(2, m+1): if sieve[i] == ..

    [Algorithm] ์ด์ง„ ํƒ์ƒ‰ | Binary Search

    1. ์ˆœ์ฐจ ํƒ์ƒ‰ : ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ํƒ์ƒ‰ ๋ฐฉ๋ฒ• - ๋ฆฌ์ŠคํŠธ ์•ˆ์— ์žˆ๋Š” ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ์•ž์—์„œ๋ถ€ํ„ฐ ํ•˜๋‚˜์”ฉ ํ™•์ธ - ์ •๋ ฌ๋˜์ง€ ์•Š์€ ๋ฆฌ์ŠคํŠธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ๋•Œ ์‚ฌ์šฉ - ํŒŒ์ด์ฌ์˜ count() ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ ์ˆœ์ฐจ ํƒ์ƒ‰์ด ์‚ฌ์šฉ๋œ๋‹ค. ๐Ÿ“Œ ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n) # target = ์ฐพ๊ณ ์žํ•˜๋Š” ์›์†Œ def search(n, target, array): for i in range(n): # ํ˜„์žฌ์˜ ์›์†Œ๊ฐ€ target๊ณผ ๋™์ผํ•˜๋ฉด if array[i] == target: return i # ํ˜„์žฌ์˜ ์œ„์น˜ ์ธ๋ฑ์Šค ๋ฐ˜ํ™˜ 2. ์ด์ง„ ํƒ์ƒ‰(์ด๋ถ„ ํƒ์ƒ‰) : ๋ฒ”์œ„๋ฅผ ์ ˆ๋ฐ˜์”ฉ ๋‚˜๋ˆ„๋ฉฐ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ• - ๋ฐฐ์—ด ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ •๋ ฌ๋˜์–ด ์žˆ์–ด์•ผ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅ - ๋ณ€์ˆ˜ 3๊ฐœ ํ•„์š”: ์‹œ์ž‘์ , ๋์ , ์ค‘๊ฐ„์  - ์ค‘๊ฐ„์ ์ด ์‹ค์ˆ˜ ์ผ ๋•Œ๋Š” ์†Œ์ˆ˜์  ์ดํ•˜..

    [Algorithm] ์ •๋ ฌ | ์„ ํƒ ์ •๋ ฌ, ์‚ฝ์ž… ์ •๋ ฌ, ํ€ต ์ •๋ ฌ, ๊ณ„์ˆ˜ ์ •๋ ฌ

    ์ •๋ ฌ์ด๋ž€ ์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ํŠน์ • ๊ธฐ์ค€์— ๋”ฐ๋ผ ์ˆœ์„œ๋Œ€๋กœ ๋‚˜์—ดํ•˜์—ฌ ์žฌ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ์ •๋ ฌ๋œ ๋ฐฐ์—ด์—์„œ ์›ํ•˜๋Š” ๊ฐ’์„ ํƒ์ƒ‰ํ•˜๋Š” ์ด์ง„ ํƒ์ƒ‰(Binary Search)๋ฅผ ์œ„ํ•ด์„œ๋Š” ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ž˜ ์•Œ์•„๋‘์–ด์•ผ ํ•œ๋‹ค. 1. ์„ ํƒ ์ •๋ ฌ ๐Ÿ“Œ ๊ฐ€์žฅ ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ์„ ํƒํ•ด ๋งจ ์•ž์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ์™€ ๊ตํ™˜ํ•˜๋Š” ๊ณผ์ •์„ ๋ฐ˜๋ณต swap(๋ฆฌ์ŠคํŠธ์—์„œ ๋‘ ์›์†Œ์˜ ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ž‘์—…)์„ ์ด์šฉํ•˜๋ฉด ์„ ํƒ์ •๋ ฌ์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. arr = [4,3,1,7,2,8,6,5] for i in range(len(arr)): min_index = i # ์šฐ์„  ๊ฐ€์žฅ ์ž‘์€ ์›์†Œ์˜ ์ธ๋ฑ์Šค๋กœ ๋งจ ์•ž์˜ ์›์†Œ๋ฅผ ์ง€์ • for j in range(i+1, len(arr)): # ๋งจ ์•ž ์›์†Œ ์ œ์™ธ if arr[min_index] > arr[j]: # ๊ฐ€์žฅ ์ž‘์€ ..

    [Algorithm] ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ | Dynamic Programming (DP)

    ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘๊ฒŒ ๋‚˜๋ˆ„๊ณ , ๊ฐ™์€ ๋ฌธ์ œ๋ผ๋ฉด ํ•œ ๋ฒˆ์”ฉ๋งŒ ํ’€์–ด ๋ฌธ์ œ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ธฐ๋ฒ• ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ  1. ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๋” ์‚ฌ์šฉํ•˜๋”๋ผ๋„, ์—ฐ์‚ฐ ์†๋„๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๊ธฐ ์œ„ํ•ด 2. ์ค‘๋ณต๋˜๋Š” ์—ฐ์‚ฐ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์‚ฌ์šฉ ์กฐ๊ฑด 1. ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ (Optimal Substructure) - ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ž‘์€ ๋ฌธ์ œ์˜ ๋‹ต์„ ๋ชจ์•„์„œ ํฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„ ๋•Œ 2. ์ค‘๋ณต๋˜๋Š” ๋ถ€๋ถ„ ๋ฌธ์ œ - ๋™์ผํ•œ ์ž‘์€ ๋ฌธ์ œ๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„ ๋•Œ ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฌธ์ œ ์ ‘๊ทผ ๋ฐฉ๋ฒ• - ๊ทธ๋ฆฌ๋””, ๊ตฌํ˜„, ์™„์ „ ํƒ์ƒ‰ ๋“ฑ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์ง€ ๊ฒ€ํ† ํ•œ ํ›„ ๋– ์˜ค๋ฅด์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ณ ๋ คํ•ด๋ณธ๋‹ค. - ์žฌ๊ท€ ํ•จ์ˆ˜๋กœ ์ž‘์„ฑํ•ด๋ณธ ํ›„, ์ž‘์€ ๋ฌธ์ œ์—์„œ ..