์ธ๋„ค์ผ 17. ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ (Dynamic Programming) Codility Lesson ํ•œ๊ตญ์–ด ์ •๋ฆฌ๋ณธ (JavaScript ver.) ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Dynamic Programming)์ด๋ž€?๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ(DP)์€ ์ž‘์€ ๋ฌธ์ œ๋“ค์˜ ํ•ด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋” ํฐ ๋ฌธ์ œ์˜ ํ•ด๋ฅผ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ธฐ๋ฒ• ์ด๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ์—ฌ๋Ÿฌ ์ž‘์€ ๋ถ€๋ถ„ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆ„๊ณ , ์ค‘๋ณต ๊ณ„์‚ฐ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅ(memoization) ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ํšจ๊ณผ์ ์ธ ๊ฒฝ์šฐ:์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ(Optimal Substructure): ํฐ ๋ฌธ์ œ์˜ ์ตœ์ ํ•ด๊ฐ€ ์ž‘์€ ๋ถ€๋ถ„ ๋ฌธ์ œ์˜ ์ตœ์ ํ•ด๋กœ ๊ตฌ์„ฑ๋  ์ˆ˜ ์žˆ์Œ์ค‘๋ณต ๋ถ€๋ถ„ ๋ฌธ์ œ(Overlapping Subproblems): ๋™์ผํ•œ ์ž‘์€ ๋ฌธ์ œ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋Œ€ํ‘œ์ ์ธ DP ๋ฌธ์ œ:์ตœ๋‹จ ๊ฒฝ๋กœ ๋ฌธ์ œ (Floyd-Warshall, Bellman-Ford)๋ฐฐ๋‚ญ ๋ฌธ์ œ (Knapsack Problem)๋™์ „ ๊ฑฐ์Šค๋ฆ„๋ˆ ๋ฌธ์ œ (Coi..
์ธ๋„ค์ผ 16. ํƒ์š•์  ์•Œ๊ณ ๋ฆฌ์ฆ˜ (Greedy Algorithms) Codility Lesson ํ•œ๊ตญ์–ด ์ •๋ฆฌ๋ณธ (JavaScript ver.) ํƒ์š•์  ์•Œ๊ณ ๋ฆฌ์ฆ˜(Greedy Algorithm)์ด๋ž€?ํƒ์š•์  ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ฐ ๋‹จ๊ณ„์—์„œ ๊ฐ€์žฅ ์ตœ์„ ์˜ ์„ ํƒ์„ ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ตœ์ ํ•ด๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ• ์ด๋‹ค. ์ „์ฒด ์ตœ์ ํ•ด๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ , ๋งค ์ˆœ๊ฐ„ ์ตœ์ ์˜ ์„ ํƒ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌํ˜„์ด ๊ฐ„๋‹จํ•˜์ง€๋งŒ, ํ•ญ์ƒ ์ตœ์ ํ•ด๋ฅผ ๋ณด์žฅํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.ํƒ์š•์  ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ๋Œ€ํ‘œ์ ์ธ ๋ฌธ์ œ๋“ค:๋™์ „ ๊ฑฐ์Šค๋ฆ„๋ˆ ๋ฌธ์ œ (Coin Change Problem)ํšŒ์˜์‹ค ๋ฐฐ์ • ๋ฌธ์ œ (Activity Selection Problem)์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ (Kruskal, Prim ์•Œ๊ณ ๋ฆฌ์ฆ˜)์ตœ๋‹จ ๊ฒฝ๋กœ ํƒ์ƒ‰ (Dijkstra ์•Œ๊ณ ๋ฆฌ์ฆ˜)1. O(n) ์‹œ๊ฐ„ ๋ณต์žก๋„์˜ ๊ฑฐ์Šค๋ฆ„๋ˆ ๋ฌธ์ œ ํ•ด๊ฒฐ๊ฑฐ์Šค๋ฆ„๋ˆ ๋ฌธ์ œ๋Š” ์ฃผ์–ด์ง„ ๋™์ „๋“ค๋กœ ํŠน์ • ๊ธˆ์•ก์„ ์ตœ์†Œ ๊ฐœ์ˆ˜์˜ ๋™์ „์œผ๋กœ ๋งŒ๋“œ๋Š” ๋ฌธ์ œ ์ด๋‹ค. ํƒ์š•์  ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ฐ€์žฅ ํฐ ๋™์ „๋ถ€ํ„ฐ ์„ ํƒํ•˜๋Š” ..
์ธ๋„ค์ผ 15. ์บํ„ฐํ•„๋Ÿฌ ๋ฐฉ๋ฒ• (Caterpillar Method) Codility Lesson ํ•œ๊ตญ์–ด ์ •๋ฆฌ๋ณธ (JavaScript ver.) 1. ์บํ„ฐํ•„๋Ÿฌ ๋ฐฉ๋ฒ•์ด๋ž€?์บํ„ฐํ•„๋Ÿฌ ๋ฐฉ๋ฒ•์€ ์—ฐ์†๋œ ๋ถ€๋ถ„ ๋ฐฐ์—ด(์Šฌ๋ผ์ด์Šค)์—์„œ ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ฐพ๋Š” ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ• ์ด๋‹ค. ๋ณดํ†ต O(n) ์‹œ๊ฐ„ ๋ณต์žก๋„๋กœ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.2. O(n) ์‹œ๊ฐ„ ๋ณต์žก๋„์˜ ์บํ„ฐํ•„๋Ÿฌ ๋ฐฉ๋ฒ•JavaScript ์ฝ”๋“œ:function caterpillarMethod(A, s) { let n = A.length, front = 0, sum = 0; for (let back = 0; back ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด O(n) ์‹œ๊ฐ„ ๋ณต์žก๋„๋กœ ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ถ€๋ถ„ ๋ฐฐ์—ด์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.3. ์บํ„ฐํ•„๋Ÿฌ ๋ฐฉ๋ฒ•์˜ ํ™œ์šฉ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค:์—ฐ์† ๋ถ€๋ถ„ ๋ฐฐ์—ด์˜ ํ•ฉ ์ฐพ๊ธฐ (์˜ˆ: ์—ฐ์†๋œ ์ˆซ์ž์˜ ํ•ฉ์ด ํŠน์ • ๊ฐ’ s๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ ์ฐพ๊ธฐ)์—ฐ์†๋œ ์›์†Œ๋“ค์˜ ๊ณฑ ์ฐพ๊ธฐ (์˜ˆ: ์ตœ๋Œ€ ..
์ธ๋„ค์ผ 14. ์ด์ง„ ํƒ์ƒ‰ (Binary Search) Codility Lesson ํ•œ๊ตญ์–ด ์ •๋ฆฌ๋ณธ (JavaScript ver.) 1. ์ด์ง„ ํƒ์ƒ‰(Binary Search)์ด๋ž€?์ด์ง„ ํƒ์ƒ‰์€ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์—์„œ ํŠน์ • ๊ฐ’์„ ์ฐพ๋Š” ํšจ์œจ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์œผ๋กœ, O(log n) ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค. ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ฐ˜๋ณต์ ์œผ๋กœ ๊ฒ€์ƒ‰ ๋ฒ”์œ„๋ฅผ ์ ˆ๋ฐ˜์œผ๋กœ ์ค„์ด๋ฉด์„œ ์›ํ•˜๋Š” ๊ฐ’์„ ์ฐพ๋Š”๋‹ค.์˜ˆ๋ฅผ ๋“ค์–ด, 1๋ถ€ํ„ฐ 16๊นŒ์ง€์˜ ์ˆซ์ž ์ค‘์—์„œ ๋ชฉํ‘œ ์ˆซ์ž๋ฅผ ์ฐพ๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด์ž. ๋‹จ์ˆœ ์„ ํ˜• ํƒ์ƒ‰(linear search)์œผ๋กœ๋Š” ์ตœ์•…์˜ ๊ฒฝ์šฐ 16๋ฒˆ์˜ ๋น„๊ต๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ, ์ด์ง„ ํƒ์ƒ‰์„ ์‚ฌ์šฉํ•˜๋ฉด ์ตœ๋Œ€ 4๋ฒˆ์˜ ๋น„๊ต๋งŒ์œผ๋กœ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.2. O(log n) ์‹œ๊ฐ„ ๋ณต์žก๋„์˜ ์ด์ง„ ํƒ์ƒ‰ ๊ตฌํ˜„JavaScript ์ฝ”๋“œ:function binarySearch(A, x) { let left = 0, right = A.length - 1; while (left ์‹œ๊ฐ„ ๋ณต์žก๋„: O(log n)..
์ธ๋„ค์ผ 13. ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด (Fibonacci Numbers) Codility Lesson ํ•œ๊ตญ์–ด ์ •๋ฆฌ๋ณธ (JavaScript ver.) ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด(Fibonacci Numbers)์ด๋ž€?ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋œ๋‹ค.F(0) = 0F(1) = 1F(n) = F(n-1) + F(n-2) (n ≥ 2)์˜ˆ์ œ:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89 ...1. O(2โฟ) ์‹œ๊ฐ„ ๋ณต์žก๋„์˜ ์žฌ๊ท€ ๋ฐฉ์‹ (๋น„ํšจ์œจ์ )JavaScript ์ฝ”๋“œ:function fibonacci(n) { if (n ์ด ๋ฐฉ์‹์€ ๋„ˆ๋ฌด ๋Š๋ ค์„œ n์ด ์ปค์งˆ์ˆ˜๋ก ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.2. O(n) ์‹œ๊ฐ„ ๋ณต์žก๋„์˜ ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹JavaScript ์ฝ”๋“œ:function fibonacciDP(n) { let fib = new Array(n + 1).fill(0); fib[1] = 1; for (let i = 2; i ์ด ๋ฐฉ์‹..
์ธ๋„ค์ผ 12. ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜ (Greatest Common Divisor, GCD) Codility Lesson ํ•œ๊ตญ์–ด ์ •๋ฆฌ๋ณธ (JavaScript ver.) ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜(GCD)๋ž€?๋‘ ๊ฐœ์˜ ์ •์ˆ˜ a, b์˜ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜(GCD)๋Š” ๋‘ ์ˆ˜๋ฅผ ๋™์‹œ์— ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ํฐ ์ •์ˆ˜ ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.1. O(n) ์‹œ๊ฐ„ ๋ณต์žก๋„์˜ ์œ ํด๋ฆฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (๋บ„์…ˆ ๋ฐฉ์‹)JavaScript ์ฝ”๋“œ:function gcdSubtraction(a, b) { if (a === b) return a; return a > b ? gcdSubtraction(a - b, b) : gcdSubtraction(a, b - a);}2. O(log n) ์‹œ๊ฐ„ ๋ณต์žก๋„์˜ ์œ ํด๋ฆฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (๋‚˜๋จธ์ง€ ๋ฐฉ์‹)JavaScript ์ฝ”๋“œ:function gcd(a, b) { return a % b === 0 ? b : gcd(b, a % b);}์ด ๋ฐฉ๋ฒ•์€ ๋น ๋ฅด๊ณ , ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณต๋œ..
์ธ๋„ค์ผ 11. ์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์˜ ์ฒด (Sieve of Eratosthenes) Codility Lesson ํ•œ๊ตญ์–ด ์ •๋ฆฌ๋ณธ (JavaScript ver.) ์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์˜ ์ฒด๋ž€?์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์˜ ์ฒด(Sieve of Eratosthenes) ๋Š” ์ฃผ์–ด์ง„ ๋ฒ”์œ„ ๋‚ด์—์„œ ๋ชจ๋“  ์†Œ์ˆ˜๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ์†Œ์ˆ˜๋ฅผ ๊ฑธ๋Ÿฌ๋‚ด๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋ฉฐ, O(n log log n) ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค.1. O(n log log n) ์‹œ๊ฐ„ ๋ณต์žก๋„์˜ ์†Œ์ˆ˜ ํŒ๋ณ„JavaScript ์ฝ”๋“œ:function sieve(n) { let sieve = new Array(n + 1).fill(true); sieve[0] = sieve[1] = false; for (let i = 2; i * i ์ด ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด n ์ดํ•˜์˜ ๋ชจ๋“  ์†Œ์ˆ˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.2. ์†Œ์ธ์ˆ˜ ๋ถ„ํ•ด (Factorization)์†Œ์ธ์ˆ˜ ๋ถ„ํ•ด๋Š” ์ •์ˆ˜๋ฅผ ์†Œ์ˆ˜์˜ ๊ณฑ์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ณผ์ • ์ด๋‹ค.JavaSc..
์ธ๋„ค์ผ 10. ์†Œ์ˆ˜์™€ ํ•ฉ์„ฑ์ˆ˜ (Prime and Composite Numbers) Codility Lesson ํ•œ๊ตญ์–ด ์ •๋ฆฌ๋ณธ (JavaScript ver.) ์†Œ์ˆ˜(Prime Number)์™€ ํ•ฉ์„ฑ์ˆ˜(Composite Number)์†Œ์ˆ˜(Prime Number) ๋Š” 1๋ณด๋‹ค ํฌ๊ณ , ์ž๊ธฐ ์ž์‹ ๊ณผ 1์„ ์ œ์™ธํ•œ ์•ฝ์ˆ˜๊ฐ€ ์—†๋Š” ์ˆ˜ ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.ํ•ฉ์„ฑ์ˆ˜(Composite Number) ๋Š” 1๊ณผ ์ž๊ธฐ ์ž์‹  ์ด์™ธ์—๋„ ๋‹ค๋ฅธ ์•ฝ์ˆ˜๋ฅผ ๊ฐ€์ง€๋Š” ์ˆ˜ ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.์˜ˆ๋ฅผ ๋“ค์–ด, 2, 3, 5, 7, 11, 13 ๋“ฑ์€ ์†Œ์ˆ˜์ด๋ฉฐ, 4, 6, 8, 9, 10 ๋“ฑ์€ ํ•ฉ์„ฑ์ˆ˜์ด๋‹ค.1. O(√n) ์‹œ๊ฐ„ ๋ณต์žก๋„์˜ ์•ฝ์ˆ˜ ๊ฐœ์ˆ˜ ๊ตฌํ•˜๊ธฐn์˜ ์•ฝ์ˆ˜๋ฅผ ์ฐพ๋Š” ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ•์€ 1๋ถ€ํ„ฐ n๊นŒ์ง€ ๋ชจ๋“  ์ˆ˜๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ ์ด๋‹ค. ํ•˜์ง€๋งŒ n์˜ ์•ฝ์ˆ˜๋Š” ๋Œ€์นญ์„ฑ์„ ๊ฐ€์ง€๋ฏ€๋กœ, √n ๊นŒ์ง€๋งŒ ํƒ์ƒ‰ํ•ด๋„ ์ „์ฒด ์•ฝ์ˆ˜๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.JavaScript ์ฝ”๋“œ:function countDivisors(n) { let count = 0; let..
์ธ๋„ค์ผ 9. ์ตœ๋Œ€ ์Šฌ๋ผ์ด์Šค ๋ฌธ์ œ (Maximum Slice Problem) Codility Lesson ํ•œ๊ตญ์–ด ์ •๋ฆฌ๋ณธ (JavaScript ver.) ์ตœ๋Œ€ ์Šฌ๋ผ์ด์Šค ๋ฌธ์ œ๋ž€?์ฃผ์–ด์ง„ ์ •์ˆ˜ ๋ฐฐ์—ด A = [aโ‚€, aโ‚, ..., aโ‚™โ‚‹โ‚] ์—์„œ ์—ฐ์†๋œ ๋ถ€๋ถ„ ๋ฐฐ์—ด(์Šฌ๋ผ์ด์Šค, Slice) ์ค‘ ํ•ฉ์ด ์ตœ๋Œ€๊ฐ€ ๋˜๋Š” ๊ตฌ๊ฐ„์„ ์ฐพ๋Š” ๋ฌธ์ œ ์ด๋‹ค. ์ฆ‰, ๋‘ ์ธ๋ฑ์Šค p, q (p ≤ q)๋ฅผ ์„ ํƒํ•˜์—ฌ A[p] + A[p+1] + ... + A[q] ๊ฐ’์ด ์ตœ๋Œ€๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ ๋ฅผ ์ฐพ๋Š”๋‹ค.์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฐ์—ด์ด ์žˆ์„ ๋•Œ:A = [5, -7, 3, 5, -2, 4, -1];์œ„ ๋ฐฐ์—ด์—์„œ ์ตœ๋Œ€ ํ•ฉ์„ ๊ฐ–๋Š” ๋ถ€๋ถ„ ๋ฐฐ์—ด์€ [3, 5, -2, 4]์ด๋ฉฐ, ํ•ฉ์€ 10์ด๋‹ค.1. O(n³) ์‹œ๊ฐ„ ๋ณต์žก๋„์˜ ๋น„ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ์Šฌ๋ผ์ด์Šค๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ์ตœ๋Œ“๊ฐ’์„ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.JavaScript ์ฝ”๋“œ:function slowMaxSlice(A) { let n = A.length; let r..