์ธ๋„ค์ผ 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..
์ธ๋„ค์ผ 8. ๋ฆฌ๋” (Leader) Codility Lesson ํ•œ๊ตญ์–ด ์ •๋ฆฌ๋ณธ (JavaScript ver.) ๋ฆฌ๋”(Leader)๋ž€?์ฃผ์–ด์ง„ ์ˆ˜์—ด A = [aโ‚€, aโ‚, ..., aโ‚™โ‚‹โ‚] ์—์„œ ๋ฆฌ๋”(Leader) ๋Š” ์ˆ˜์—ด์˜ ์›์†Œ ์ค‘ ์ ˆ๋ฐ˜์„ ์ดˆ๊ณผํ•˜์—ฌ ๋“ฑ์žฅํ•˜๋Š” ์›์†Œ ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆ˜์—ด์ด ์žˆ์„ ๋•Œ:A = [6, 8, 4, 6, 8, 6, 6];์œ„ ์ˆ˜์—ด์—์„œ 6์€ 4๋ฒˆ ๋“ฑ์žฅํ•˜์—ฌ n/2 = 3.5 ๋ณด๋‹ค ๋งŽ์ด ๋“ฑ์žฅํ•˜๋ฏ€๋กœ ๋ฆฌ๋”๊ฐ€ ๋œ๋‹ค. ๋ฆฌ๋”๋Š” ์ตœ๋Œ€ ํ•˜๋‚˜๋งŒ ์กด์žฌ ํ•œ๋‹ค.1. O(n²) ์‹œ๊ฐ„ ๋ณต์žก๋„์˜ ๋‹จ์ˆœํ•œ ๋ฐฉ๋ฒ•๊ฐ ์›์†Œ์˜ ๋“ฑ์žฅ ํšŸ์ˆ˜๋ฅผ ์„ธ์–ด ๋ฆฌ๋”๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.JavaScript ์ฝ”๋“œ:function slowLeader(A) { let n = A.length; let leader = -1; for (let k = 0; k Math.floor(n / 2)) { lea..
์ธ๋„ค์ผ 7. ์Šคํƒ๊ณผ ํ (Stacks and Queues) Codility Lesson ํ•œ๊ตญ์–ด ์ •๋ฆฌ๋ณธ (JavaScript ver.) ์Šคํƒ(Stack)๊ณผ ํ(Queue)๋ž€?์Šคํƒ๊ณผ ํ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. ์ด๋“ค์€ push(์‚ฝ์ž…) ๋ฐ pop(์‚ญ์ œ) ์—ฐ์‚ฐ์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ๋ฐ์ดํ„ฐ์˜ ์ž…์ถœ๋ ฅ ๋ฐฉ์‹์ด ๋‹ค๋ฅด๋‹ค.1. ์Šคํƒ(Stack)์Šคํƒ์€ LIFO(Last In, First Out) ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๋ฉฐ, ๊ฐ€์žฅ ์ตœ๊ทผ์— ์ถ”๊ฐ€๋œ ์š”์†Œ๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € ์ œ๊ฑฐ๋œ๋‹ค. ๋งˆ์น˜ ์ ‘์‹œ๋ฅผ ์Œ“์•„์˜ฌ๋ฆฌ๊ณ  ์œ„์—์„œ๋ถ€ํ„ฐ ํ•˜๋‚˜์”ฉ ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉ์‹๊ณผ ์œ ์‚ฌํ•˜๋‹ค.JavaScript ์ฝ”๋“œ:class Stack { constructor() { this.stack = []; } push(x) { this.stack.push(x); } pop() { if (this.isEmpty()) throw new ..