๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป Programming ๊ฐœ๋ฐœ/๐ŸŽ iOS ๊ฐœ๋ฐœ, Swift

[Swift][๋ฒˆ์—ญ] ์Šค์œ„ํ”„ํŠธ์˜ ์ž๋ฃŒ๊ตฌ์กฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ - ์„น์…˜ 1. ์†Œ๊ฐœ - ์ฑ•ํ„ฐ1. ์™œ ์ž๋ฃŒ๊ตฌ์กฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ฐฐ์›Œ์•ผํ• ๊นŒ์š”? ์ฑ•ํ„ฐ2. ๋ณต์žก๋„

by kimdee 2022. 5. 13.
๋ฐ˜์‘ํ˜•

 

Raywenderlich.com ์—์„œ ๋‚˜์˜จ Data Structures & Algorithms in Swift ์ฑ…์˜ ๋ฐ๋ชจ ๊ณต๊ฐœ๋ณธ์„ ๋ฒˆ์—ญํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ฆ๊ฒ๊ฒŒ ๋ด์ฃผ์„ธ์š”. 

https://www.raywenderlich.com/books/data-structures-algorithms-in-swift

 


 

 

์„น์…˜ 1. ์†Œ๊ฐœ Introduction

์ฑ•ํ„ฐ1. ์™œ ์ž๋ฃŒ๊ตฌ์กฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ฐฐ์›Œ์•ผํ• ๊นŒ์š”?

์ž๋ฃŒ๊ตฌ์กฐ ์—ฐ๊ตฌ๋Š” ํšจ์œจ์„ฑ์˜ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ํŠน์ • ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ •ํ•ด์ง„ ์–‘์„ ์ €์žฅํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ผ๊ฐ€์š”?

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ๋ฐฐ์—ด๊ณผ ๋”•์…”๋„ˆ๋ฆฌ, ์„ธํŠธ์™€ ๊ฐ™์ด ์ฝœ๋ ‰์…˜ ํƒ€์ž…์„ ์ •๊ธฐ์ ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ๋“ค์€ ๋ฐ์ดํ„ฐ ์ฝœ๋ ‰์…˜์„ ๋ณด์œ ํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ๊ฐ ๊ตฌ์กฐ์—๋Š” ๊ณ ์œ ํ•œ ์„ฑ๋Šฅ ํŠน์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฐฐ์—ด๊ณผ ์„ธํŠธ์— ์ฐจ์ด์ ์„ ๊ณ ๋ คํ•ด๋ณด์„ธ์š”. ๋‘˜ ๋‹ค ์ฝœ๋ ‰์…˜์ด์ง€๋งŒ ์„ธํŠธ์—์„œ ์š”์†Œ๋ฅผ ์ฐพ๋Š” ๊ฒƒ๋ณด๋‹ค ๋ฐฐ์—ด์—์„œ ์ฐพ๋Š” ๊ฒƒ์€ ํ›จ์”ฌ ๋” ์˜ค๋ž˜ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— ๋ฐฐ์—ด์˜ ์š”์†Œ๋Š” ์ˆœ์„œ๋ฅผ ์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์„ธํŠธ๋Š” ๊ทธ๋Ÿฌ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

 

์ž๋ฃŒ๊ตฌ์กฐ๋Š” ์ž˜ ์—ฐ๊ตฌ๋œ ๋ถ„์•ผ๋กœ, ์ด ๊ฐœ๋…์€ ์–ธ์–ด์— ๊ตฌ์• (language agnostic)๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค. C์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ๊ธฐ๋Šฅ์ ์œผ๋กœ๋‚˜ ๊ฐœ๋…์ ์œผ๋กœ๋‚˜ Swift์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์–ธ์–ด์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๋™์‹œ์— Swift์˜ ๊ณ ์ˆ˜์ค€์˜ ํ‘œํ˜„๋ ฅ์€ ์„ฑ๋Šฅ์„ ํฌ์ƒํ•˜์ง€์•Š์œผ๋ฉด์„œ๋„ ์ด๋Ÿฌํ•œ ํ•ต์‹ฌ ๊ฐœ๋…์„ ์ตํžˆ๋Š” ๋ฐ ์ด์ƒ์ ์ธ ์„ ํƒ์„ ํ•  ์ˆ˜ ์ž‡๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

 

๋ฐ˜๋ฉด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ผ๋ จ์˜ ํ–‰์œ„์˜ ๋ชจ์Œ์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌํ•˜๋Š” ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋˜๊ฑฐ๋‚˜ 8K ์‚ฌ์ด์ฆˆ์˜ ์‚ฌ์ง„์„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” ํฌ๊ธฐ๋กœ ์••์ถ•ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์†Œํ”„ํŠธ์›จ์–ด์— ๋งค์šฐ ํ•„์ˆ˜์ ์ด๋ฉฐ, ์œ ์šฉํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๋ธ”๋ก์œผ๋กœ์จ ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋ ‡๋‹ค๋ฉด, ์™œ ์ž๋ฃŒ๊ตฌ์กฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ฐฐ์›Œ์•ผ ํ• ๊นŒ์š”?

 

๋ฉด์ ‘

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ธฐ์ˆ ์„ ๋†’์ด ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ด์œ ๋Š” ๋ฉด์ ‘์„ ์ค€๋น„ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ํšŒ์‚ฌ๋Š” ์—”์ง€๋‹ˆ์–ด์˜ ๋Šฅ๋ ฅ์„ ์‹œํ—˜ํ•˜๊ธฐ ์œ„ํ•ด ์ตœ์†Œ ํ•œ๋‘๊ฐœ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์งˆ๋ฌธ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ž๋ฃŒ๊ตฌ์กฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•œ ๋‹จ๋‹จํ•œ ๊ธฐ์ดˆ๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋ง์˜ ๊ธฐ์ค€์ด ๋ฉ๋‹ˆ๋‹ค.

 

์—…๋ฌด

๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์ ์ ˆํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋งž๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์†Œํ”„ํŠธ์›จ์–ด์˜ ์„ฑ๋Šฅ๊ณผ ํ™•์žฅ์„ฑ์— ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋ฐ”์ผ ์•ฑ์˜ ๋ฐ˜์‘์„ฑ๊ณผ ๋ฐฐํ„ฐ๋ฆฌ ์ˆ˜๋ช…์ด ์ €์šฑ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์•ฑ์€ ๋” ๋งŽ์€ ๋™์‹œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋” ์ ์€ ์—๋„ˆ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜์—๋Š” ๋” ๋‚˜์€ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š”๋ฐ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ •ํ™•์„ฑ ์ฆ๋ช…(The proof of correctiveness)๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

์˜ฌ๋ฐ”๋ฅธ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋…์ž์—๊ฒŒ ์ปจํ…์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•˜๋Š”๋ฐ๋„ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ฝ”๋“œ ๋ฒ ์ด์Šค์—์„œ Set์„ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ฆ‰์‹œ ์—ฌ๋Ÿฌ๋ถ„์€ ์•„๋ž˜์™€ ๊ฐ™์€ ์‚ฌํ•ญ์„ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. Set์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์š”์†Œ์— ๋Œ€ํ•œ ์ˆœ์„œ๋Š” ์ƒ๊ด€ํ•˜์ง€ ์•Š๋Š”๋‹ค. Set์€ ์ •๋ ฌ๋˜์ง€ ์•Š๋Š” ์ปฌ๋ ‰์…˜์ด๊ธฐ ๋•Œ๋ฌธ์—.
  2. Set์€ ๋˜ํ•œ ์ค‘๋ณต๋œ ๊ฐ’์ด ์—†๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๊ณ ์œ ํ•œ ๋ฐ์ดํ„ฐ๋กœ ์ž‘์—…ํ•˜๋Š” ๊ฒƒ์„ ๊ฐ€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. Set์€ Value Membership์„ ์ฒดํฌํ•˜๊ธฐ ์ ํ•ฉํ•˜๋ฏ€๋กœ ์—”์ง€๋‹ˆ์–ด๊ฐ€ ์ด๋Ÿฌํ•œ ๋ชฉ์ ์œผ๋กœ ๋„์ž„ํ•œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์–‘ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ์— ์ต์ˆ™ํ•ด์ง€๋ฉด, ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ํ•˜๋‚˜์˜ ๋‹จ์„œ๋กœ์จ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ์˜ ๋ถ€๊ฐ€์ ์ธ ๋งฅ๋ฝ์„ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๊ฐ•๋ ฅํ•œ ์Šคํ‚ฌ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

 

์ž๊ธฐ๊ฐœ๋ฐœ

๊นŒ๋‹ค๋กœ์šด ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์‚ฌ์šฉํ•˜๋Š” ์ „๋žต์„ ์•Œ๊ฒŒ๋˜๋ฉด, ์ฝ”๋“œ ๊ฐœ์„ ์„ ์œ„ํ•œ ์•„์ด๋””์–ด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Swift์˜ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ฒ”์šฉ์˜ ์ฝœ๋ ‰์…˜ ํƒ€์ž…์˜ ์ž‘์€ ์„ธํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ๋“ค์ด ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ๋‹ค๋ฃจ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ , ์•ž์œผ๋กœ ๋ณด๊ฒŒ ๋˜๊ฒ ์ง€๋งŒ, ์ด๋Ÿฌํ•œ ๊ธฐ๋ณธํƒ€์ž…์€ ๋”์šฑ ๋ณต์žกํ•˜๊ณ  ํŠน๋ณ„ํ•œ ํ˜•ํƒœ์˜ ์ถ”์ƒํ™”๋ฅผ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ํ›Œ๋ฅญํ•œ ์ถœ๋ฐœ์ ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ‘œ์ค€ ๋ฐฐ์—ด๊ณผ ๋”•์…”๋„ˆ๋ฆฌ ๋ณด๋‹ค ๋” ๋งŽ์€ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์•Œ๊ฒŒ๋˜๋ฉด ์•ฑ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ๋” ๋งŽ์€ ๋„๊ตฌ์˜ ์ฝœ๋ ‰์…˜์„ ์–ป๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์–ด๋Š ํ˜„๋ช…ํ•œ ์‚ฌ๋žŒ์ด ๋งํ•˜๊ธธ, ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์—ฐ์Šตํ•˜๋Š” ๊ฒƒ์€ ์Œ์•…๊ฐ€๊ฐ€ ์Šค์ผ€์ผ์„ ์—ฐ์Šตํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์œ ์‚ฌํ•˜๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์ดˆ๊ฐ€ ๋” ๋‹ค๋“ฌ์–ด์งˆ์ˆ˜๋ก ๋”์šฑ ๋ณต์žกํ•œ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์ด ๋‚˜์•„์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์ด ์ฑ…์˜ ๋ชฉํ‘œ

์ด ์ฑ…์€ ์ฐธ๊ณ ์„œ์ด์ž ์—ฐ์Šต์„œ์ž…๋‹ˆ๋‹ค. raywenderlich.com์˜ ๋‹ค๋ฅธ ์ฑ…์— ์ต์ˆ™ํ•˜ํ•˜๋‹ค๋ฉด, ์ง‘์— ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ ์ฑ•ํ„ฐ๋Š” ๋ช‡๊ฐ€์ง€ ์ฑŒ๋ฆฐ์ง€๊ฐ€ ์žˆ๋Š” ์งง์€ ์ฑ•ํ„ฐ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค. ๊ฐ ์ฑ•ํ„ฐ์˜ ๋งจ ๋งˆ์ง€๋ง‰์—์„œ ์ฑŒ๋ฆฐ์ง€์˜ ํ•ด๋‹ต์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹ต์„ ๋ณด๊ธฐ ์ „์— ์ตœ๋Œ€ํ•œ ์ง„์ง€ํ•˜๊ฒŒ ๋ฌธ์ œํ•ด๊ฒฐ์„ ํ•˜๋„๋ก ๋…ธ๋ ฅํ•ด๋ณด์„ธ์š”.

์ด ์ฑ…์€ 5๊ฐœ์˜ ์„น์…˜์œผ๋กœ ์ด๋ฃจ์–ด์ ธ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ๊ฐ ์•„๋ž˜์™€ ๊ฐ™์€ ์ฃผ์ œ๋ฅผ ๋‹ค๋ฃจ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์†Œ๊ฐœ
  2. ์ž๋ฃŒ๊ตฌ์กฐ ๊ธฐ๋ณธ
  3. ํŠธ๋ฆฌ
  4. ์ •๋ ฌ
  5. ๊ทธ๋ž˜ํ”„

์ด ์ฑ…์€ ์“ฐ์—ฌ์ง„ ์ˆœ์„œ๋Œ€๋กœ ์ฝ๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์ง€๋งŒ, ์ฐธ๊ณ ์šฉ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ์–ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

๋งŒ์•ฝ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์ž๋ฃŒ๊ตฌ์กฐ ๊ณต๋ถ€๊ฐ€ ์ฒ˜์Œ์ด๋ผ๋ฉด, ์ฑ…์˜ ์ผ๋ถ€ ์ž๋ฃŒ๋“ค์ด ์–ด๋ ต๊ฒŒ ๋Š๊ปด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋๊นŒ์ง€ ์ž˜ ๋”ฐ๋ผ์˜จ๋‹ค๋ฉด Swift์˜ ์ž๋ฃŒ๊ตฌ์กฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋งˆ์Šคํ„ฐ๊ฐ€ ๋˜๋Š” ๊ธธ์„ ์ž˜ ๊ฐˆ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์ œ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 


 

์ฑ•ํ„ฐ 2. ๋ณต์žก๋„ Complexity

“๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ๊นŒ์š”?”

์ด ์˜ค๋ž˜๋œ ์งˆ๋ฌธ์€ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์˜ ์„ค๊ณ„๋‹จ๊ณ„์—์„œ ํ•ญ์ƒ, ๋˜ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ๋กœ ๋ฌป๊ฒŒ ๋˜๋Š” ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค. ์•„ํ‚คํ…์ฒ˜ ๊ด€์ ์—์„œ ํ™•์žฅ์„ฑ์€ ์•ฑ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์–ผ๋งŒ๋‚˜ ์‰ฌ์šด๊ฐ€์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€์ ์—์„œ ํ™•์žฅ์„ฑ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ฒ€์ƒ‰(retrieve)ํ•˜๋Š” ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค.

 

์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ํ™•์žฅ์„ฑ์€ ์ธํ’‹์˜ ์‚ฌ์ด์ฆˆ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹คํ–‰์‹œ๊ฐ„๊ณผ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ์ธก๋ฉด์—์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์„ ์ผ์ปซ์Šต๋‹ˆ๋‹ค.

 

์ ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋กœ ์ˆ˜ํ–‰ํ•  ๊ฒฝ์šฐ, ๋น„์‹ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋น ๋ฅด๊ฒŒ ๋Š๊ปด์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ฐ์ดํ„ฐ์˜ ์–‘์ด ์ฆ๊ฐ€ํ•  ์ˆ˜๋ก ๋น„์‹ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์žฅ์• (crippling)๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์–ผ๋งˆ๋‚˜ ๋‚˜๋น ์งˆ ์ˆ˜ ์žˆ์„๊นŒ์š”? ์ •๋Ÿ‰์ ์œผ๋กœ ์ธก์ •ํ•˜๋Š” ๋ฒ•์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์€ ์—ฌ๋Ÿฌ๋ถ„์ด ์•Œ์•„์•ผ ๋  ์ค‘์š”ํ•œ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.

์ด๋ฒˆ ์ฑ•ํ„ฐ์—์„œ๋Š” Big O ํ‘œ๊ธฐ๋ฒ•์— ๋Œ€ํ•ด์„œ ํ–‰์‹œ๊ฐ„๊ณผ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด๋ผ๋Š” ๋‘ ์ฐจ์›์˜ ๋‹ค๋ฅธ ํ™•์žฅ์„ฑ ๋ ˆ๋ฒจ์—์„œ ์‚ดํŽด๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์‹œ๊ฐ„ ๋ณต์žก๋„ Time Complexity

์ ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ์—์„œ๋Š” ๊ฐ€์žฅ ๋น„์‹ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋”๋ผ๋„ ์š”์ฆ˜์˜ ํ•˜๋“œ์›จ์–ด ์†๋„๋กœ ์ธํ•ด ๋น ๋ฅด๊ฒŒ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฐ์ดํ„ฐ๊ฐ€ ์ฆ๊ฐ€ํ•  ์ˆ˜๋ก ๋น„์‹ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋น„์šฉ์€ ๋ช…๋ฐฑํ•˜๊ฒŒ ์ฆ๊ฐ€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” ์ธํ’‹ ์‚ฌ์ด์ฆˆ๊ฐ€ ์ฆ๊ฐ€ํ•  ์ˆ˜๋ก ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ์ธก์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฒˆ ์„น์…˜์—์„œ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ํƒ€์ž… ๋ณต์žก๋„์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ณ  ์ด๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›๋‹ˆ๋‹ค.

 

์ƒ์ˆ˜์‹œ๊ฐ„ Constant time

์ƒ์ˆ˜์‹œ๊ฐ„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ธํ’‹์˜ ์‚ฌ์ด์ฆˆ์™€ ์ƒ๊ด€์—†์ด ์ˆ˜ํ–‰ ์‹œ๊ฐ„์ด ๋™์ผํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์„ธ์š”.

 

func checkFirst(names: [String]) {
  if let first = names.first {
    print(first)
  } else {
    print("no names")
  }
}

names ๋ฐฐ์—ด์˜ ์‚ฌ์ด์ฆˆ๋Š” ์ด ํ•จ์ˆ˜์˜ ์‹คํ–‰์‹œ๊ฐ„์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ธํ’‹์ด 10๋“ , 1์ฒœ๋งŒ๊ฐœ๊ฐ€ ๋˜๋“ , ์ด ํ•จ์ˆ˜๋Š” ์˜ค์ง ๋ฐฐ์—ด์˜ ์ฒซ๋ฒˆ์งธ ์š”์†Œ๋งŒ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ์‹œ๊ฐํ™”ํ•œ, ์‹œ๊ฐ„๊ณผ ๋ฐ์ดํ„ฐ ์‚ฌ์ด์ฆˆ์˜ ๊ทธ๋ž˜ํ”„์ž…๋‹ˆ๋‹ค.

 

์ธํ’‹ ๋ฐ์ดํ„ฐ๊ฐ€ ์ฆ๊ฐ€ํ•ด๋„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ˆ˜ํ–‰ํ•˜๋Š” ์‹œ๊ฐ„์€ ๋ณ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐ„๊ฒฐํ•จ์„ ์œ„ํ•ด์„œ, ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” Bit O ํ‘œ๊ธฐ๋ฒ•์„ ์ด์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ๊ทœ๋ชจ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ƒ์ˆ˜์‹œ๊ฐ„์˜ Big O ํ‘œ๊ธฐ๋ฒ•์€ O(1)์ž…๋‹ˆ๋‹ค.

 

์„ ํ˜•์‹œ๊ฐ„ Linear time

์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ํ•œ ๋ฒˆ ๋ด…์‹œ๋‹ค.

func printNames(names: [String]) {
  for name in names {
    print(name)
  }
}

์ด ํ•จ์ˆ˜๋Š” String ๋ฐฐ์—ด ์•ˆ์— ์žˆ๋Š” ๋ชจ๋“  ์ด๋ฆ„์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์ธํ’‹ ๋ฐฐ์—ด์˜ ์‚ฌ์ด์ฆˆ๊ฐ€ ์ฆ๊ฐ€ํ• ์ˆ˜๋ก, for ๋ฐ˜๋ณต๋ถ„์˜ ๋ฐ˜๋ณตํšŸ์ˆ˜๋„ ๊ฐ™์€ ์–‘์œผ๋กœ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์„ ํ˜•์‹œ๊ฐ„ ๋ณต์žก๋„๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

 

์„ ํ˜•์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” ์ดํ•ดํ•˜๊ธฐ ๊ฐ€์žฅ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ์˜ ์–‘์ด ๋Š˜์–ด๋‚˜๋ฉด ์‹คํ–‰์‹œ๊ฐ„๋„ ๊ฐ™์€ ์–‘์œผ๋กœ ๋Š˜์–ด๋‚ฉ๋‹ˆ๋‹ค. ์œ„์— ์„ ํ˜• ๊ทธ๋ž˜ํ”„๋Š” ์ด๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. Bit O ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ์„ ํ˜•์‹œ๊ฐ„์€ O(n) ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด 2๊ฐœ์˜ ๋ฐ˜๋ณต๋ฌธ์ด ์žˆ๊ณ , ์—ฌ์„ฏ๊ฐœ์˜ O(1) ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜๋Š” O(2n + 6)์ผ๊นŒ์š”?

์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” ๋†’์€ ์ˆ˜์ค€์˜ ์„ฑ๋Šฅ ํ˜•ํƒœ๋งŒ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋•Œ๋ฌธ์— ์ •ํ•ด์ง„ ํšŸ์ˆ˜๋งŒํผ ๋ฐ˜๋ณต๋˜๋Š” ๊ฒƒ์€ ๊ณ„์‚ฐ์— ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ƒ์ˆ˜๋Š” ์ตœ์ข… Big O ํ‘œ๊ธฐ๋ฒ•์—์„œ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, O(2n+6)์€ ๋†€๋ž๊ฒŒ๋„ O(n)๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.์ด ์ฑ…์˜ ์ฃผ์š” ๊ด€์‹ฌ์‚ฌ๋Š” ์•„๋‹ˆ์ง€๋งŒ, ์ ˆ๋Œ€์ ์ธ ํšจ์œจ์„ฑ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ํšŒ์‚ฌ๋“ค์€ Big O ํ‘œ๊ธฐ๋ฒ•์—์„œ ๋ฌด์‹œ๋˜๋Š” ์ƒ์ˆ˜์˜ ๊ธฐ์šธ๊ธฐ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ์ˆ˜๋ฐฑ๋งŒ ๋‹ฌ๋Ÿฌ์˜ R&D์— ํˆฌ์žํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด GPU์˜ ์ตœ์ ํ™”๋œ ๋ฒ„์ „์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ธฐ๋ณธ CPU์˜ ๋ฒ„์ „๋ณด๋‹ค 100๋ฐฐ ๋” ๋น ๋ฅด๊ฒŒ ์ž‘๋™ํ•˜์ง€๋งŒ, ์—ฌ์ „ํžˆ O(n)์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์ตœ์ ํ™”์™€ ์†๋„ํ–ฅ์ƒ์— ๋Œ€ํ•ด์„œ๋Š” ๋ฌด์‹œํ•˜๊ณ  ์ง„ํ–‰ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

ํ‰๋ฐฉ์‹œ๊ฐ„(2์ฐจ์‹œ๊ฐ„) Quadratic time

๋” ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” n ์ œ๊ณฑ์ด๋ผ๊ณ  ํ•˜๋Š” ์ด ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” ์ธํ’‹ ์‚ฌ์ด์ฆˆ์˜ ์ œ๊ณฑ์— ๋น„๋ก€ํ•˜๋Š” ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์„ธ์š”.

func printNames(names: [String]) {
  for _ in names {
    for name in names {
      print(name)
    }
  }
}

์ด๋ฒˆ์—๋Š” ํ•จ์ˆ˜๊ฐ€ ๋ฐฐ์—ด์— ์žˆ๋Š” ๋ชจ๋“  ์ด๋ฆ„ ๋ฐฐ์—ด์— ๋Œ€ํ•œ ์ด๋ฆ„์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ 10๊ฐœ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ๋ฐฐ์—ด์ด๋ผ๋ฉด 10๊ฐœ์˜ ์ด๋ฆ„์ด ์žˆ๋Š” ์ „์ฒด๋ชฉ๋ก์„ 10๋ฒˆ์”ฉ ์ถœ๋ ฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. 100๊ฐœ์˜ ์ถœ๋ ฅ๋ฌธ์ด ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

๋งŒ์•ฝ ์ธํ’‹ ์‚ฌ์ด์ฆˆ๊ฐ€ ํ•˜๋‚˜ ์ฆ๊ฐ€ํ•˜๋ฉด, 11๊ฐœ์˜ ์ด๋ฆ„์„ 11๋ฒˆ ์ถœ๋ ฅํ•˜๊ณ , 121๊ฐœ์˜ ์ถœ๋ ฅ๋ฌธ์ด ๋‚˜์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์„ ํ˜•์‹œ๊ฐ„ ๋™์•ˆ ์ˆ˜ํ–‰๋˜๋Š” ์ด์ „ ํ•จ์ˆ˜์™€ ๋‹ค๋ฅด๊ฒŒ, n ์ œ๊ณฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ฐ์ดํ„ฐ ์‚ฌ์ด์ฆˆ๊ฐ€ ์ฆ๊ฐ€ํ•  ์ˆ˜๋ก ๋” ๋น ๋ฅด๊ฒŒ ํ†ต์ œ๋ฅผ ์žƒ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ทธ๋ž˜ํ”„๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

์ธํ’‹ ๋ฐ์ดํ„ฐ์˜ ์‚ฌ์ด์ฆˆ๊ฐ€ ์ฆ๊ฐ€ํ•  ์ˆ˜๋ก, ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์‹œ๊ฐ„์€ ๊ธ‰๊ฒฉํ•˜๊ฒŒ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋•Œ๋ฌธ์— n ์ œ๊ณฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ทœ๋ชจ์— ๋”ฐ๋ผ ์ž˜ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Big O ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ 2์ฐจ์‹œ๊ฐ„์€ O() ์ž…๋‹ˆ๋‹ค.

์„ ํ˜• ์‹œ๊ฐ„ O(n) ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์•„๋ฌด๋ฆฌ ๋น„ํšจ์œจ์ ์œผ๋กœ ์“ฐ์˜€๋”๋ผ๋„, (๋‹ค์ค‘ ํŒจ์Šค ๋“ฑ) ์ถฉ๋ถ„ํžˆ ํฐ n์— ๋Œ€ํ•ด์„œ ์„ ํ˜• ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ตœ์ ํ™”๋œ 2์ฐจ์‹œ๊ฐ„ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋ณด๋‹ค ๋น ๋ฆ…๋‹ˆ๋‹ค. ์–ธ์ œ๋‚˜.

 

๋กœ๊ทธ ์‹œ๊ฐ„ Logarithmic time

์—ฌํƒœ๊นŒ์ง€ ์šฐ๋ฆฌ๋Š” ์ธํ’‹์˜ ๋ชจ๋“  ์š”์†Œ๊ฐ€ ์ตœ์†Œ ํ•œ๋ฒˆ์”ฉ ๊ฒ€์‚ฌ๋˜๋Š” ์„ ํ˜•๋ณต์žก๋„์™€ 2์ฐจ์‹œ๊ฐ„ ๋ณต์žก๋„์— ๋Œ€ํ•ด ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ธํ’‹์˜ ์„œ๋ธŒ์…‹๋งŒ ๊ฒ€์‚ฌํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹คํ–‰์‹œ๊ฐ„์ด ๋” ๋น ๋ฅด๊ณ ์š”.

 

์ด๋Ÿฌํ•œ ์นดํ…Œ๊ณ ๋ฆฌ์— ์†ํ•˜๋Š” ์‹œ๊ฐ„๋ณต์žก๋„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ๋ช‡๊ฐ€์ง€ ๊ฐ€์ •์„ ํ•จ์œผ๋กœ์จ ๋ช‡๊ฐ€์ง€ ์ง€๋ฆ„๊ธธ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ •๋ ฌ๋œ ์ •์ˆ˜ ๋ฐฐ์—ด์ด ์žˆ๋‹ค๋ฉด, ํŠน์ •๊ฐ’์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฐ€์žฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ผ๊ฐ€์š”?

 

๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ์†”๋ฃจ์…˜์€ ๊ฒฐ๋ก ์— ๋„๋‹ฌํ•˜๊ธฐ ์ „๊นŒ์ง€ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์š”์†Œ๋ฅผ ํ•œ ๋ฒˆ์”ฉ ๊ฒ€์‚ฌํ•œ๋‹ค๋ฉด O(n) ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์„ ํ˜•์‹œ๊ฐ„ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋„ ๋ฌผ๋ก  ์ข‹์ง€๋งŒ ๋” ์ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธํ’‹ ๋ฐฐ์—ด์ด ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค๋ฉด, ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์„ธ์š”.

 

let numbers = [1, 3, 56, 66, 68, 80, 99, 105, 450]

func naiveContains(_ value: Int, in array: [Int]) -> Bool {
  for element in array {
    if element == value {
      return true
    }
  }

  return false
}

์ˆซ์ž 451์ด ์žˆ๋Š”์ง€ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ๋Š”, ๋‹จ์ˆœํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. 9๊ฐœ์˜ ๊ฐ’์ด ์žˆ๋Š” ๋ฐฐ์—ด์—์„œ๋Š” 9๋ฒˆ์˜ ๊ฒ€์‚ฌ๊ฐ€ ์ด๋ฃจ์–ด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฐฐ์—ด์ด ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค๋ฉด ์ค‘๊ฐ„๊ฐ’์„ ๊ฒ€์‚ฌํ•ด์„œ ํ•„์š”์— ๋”ฐ๋ผ ๊ฐ’์˜ ์ ˆ๋ฐ˜์„ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

func naiveContains(_ value: Int, in array: [Int]) -> Bool {
  guard !array.isEmpty else { return false }
  let middleIndex = array.count / 2

  if value <= array[middleIndex] {
    for index in 0...middleIndex {
      if array[index] == value {
        return true
      }
    }
  } else {
    for index in middleIndex..<array.count {
      if array[index] == value {
        return true
      }
    }
  }

  return false
}

์œ„ ํ•จ์ˆ˜๋Š” ๊ฒฐ๋ก ๊นŒ์ง€ ๊ฐ€๊ธฐ ์œ„ํ•ด ๋ฐฐ์—ด์˜ ์ ˆ๋ฐ˜๋งŒ์„ ๊ฒ€์‚ฌํ•˜๋Š” ์ž‘์ง€๋งŒ ์˜๋ฏธ์žˆ๋Š” ์ตœ์ ํ™”๋ฅผ ๊ฑฐ์ณค์Šต๋‹ˆ๋‹ค.

 

์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋งจ ์ฒ˜์Œ์œผ๋กœ ์›ํ•˜๋Š” ๊ฐ’๊ณผ ๋ฐฐ์—ด์˜ ์ค‘๊ฐ„๊ฐ’์„ ์ฒดํฌํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ค‘๊ฐ„๊ฐ’์ด ์›ํ•˜๋Š” ๊ฐ’๋ณด๋‹ค ํฌ๋‹ค๋ฉด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ฐฐ์—ด์˜ ์˜ค๋ฅธ์ชฝ ๊ฐ’์„ ์‚ดํŽด๋ณด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐฐ์—ด์ด ์ •๋ ฌ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๊ฐ„ ๊ฐ’์˜ ์˜ค๋ฅธ์ชฝ ๊ฐ’๋“ค์€ ์ปค์งˆ ๋ฟ์ž…๋‹ˆ๋‹ค.

 

๋ฐ˜๋ฉด์—, ์ค‘๊ฐ„ ๊ฐ’์ด ์ฐพ๋Š” ๊ฐ’๋ณด๋‹ค ์ž‘๋‹ค๋ฉด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ฐฐ์—ด์˜ ์™ผ์ชฝ ๊ฐ’์„ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋น„๊ตํšŸ์ˆ˜๋ฅผ ์ ˆ๋ฐ˜์œผ๋กœ ์ค„์ด๋Š”, ์ž‘์ง€๋งŒ ์˜๋ฏธ์žˆ๋Š” ์ตœ์ ํ™”์ž…๋‹ˆ๋‹ค.

 

์ด ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ์ด ์ตœ์ ํ™”๋ฅผ ๋ฐ˜๋ณต์œผ๋กœ ์ˆ˜ํ–‰ํ•œ๋‹ค๋ฉด ์–ด๋–จ๊นŒ์š”? ์ฑ•ํ„ฐ 20์—์„œ ๋‹ค๋ฃจ๋Š” “์ด์ง„ ํƒ์ƒ‰ Binary Search”์—์„œ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•„์š”ํ•œ ๋น„๊ต๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ, ์ ˆ๋ฐ˜์œผ๋กœ ๋‚ฎ์ถ”๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋กœ๊ทธ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์•„๋ž˜ ๊ทธ๋ž˜ํ”„๋Š” ์ธํ’‹ ๋ฐ์ดํ„ฐ๊ฐ€ ์ฆ๊ฐ€ํ• ์ˆ˜๋ก ๋กœ๊ทธ ์‹œ๊ฐ„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์–ด๋–ป๊ฒŒ ์ˆ˜ํ–‰๋˜๋Š”์ง€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

 

์ธํ’‹ ๋ฐ์ดํ„ฐ๊ฐ€ ์ฆ๊ฐ€ํ•ด๋„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‹คํ–‰ํ•˜๋Š” ์‹œ๊ฐ„์€ ์ ์€ ๋น„์œจ๋กœ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํžˆ ๋ณด๋ฉด ์œ„ ๊ทธ๋ž˜ํ”„๋Š” ์ ๊ทผ์ ์ธ ๋ชจ์–‘์ƒˆ๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ’ก ์—ญ์ฃผ : https://ko.khanacademy.org/computing/computer-science/algorithms/asymptotic-notation/a/asymptotic-notation

 

์ˆ˜ํ–‰ํ•ด์•ผ๋˜๋Š” ๋น„๊ตํšŸ์ˆ˜๋ฅผ ์ ˆ๋ฐ˜์œผ๋กœ ์ค„์ด๋Š” ๊ฒƒ์˜ ์˜ํ–ฅ์„ ๊ณ ๋ คํ•˜์—ฌ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ธํ’‹ ์‚ฌ์ด์ฆˆ๊ฐ€ 100์ผ ๊ฒฝ์šฐ, ๋น„๊ตํšŸ์ˆ˜๋ฅผ 50๋ฒˆ ์•„๋‚„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ธํ’‹ ์‚ฌ์ด์ฆˆ๊ฐ€ 10๋งŒ์ผ ๊ฒฝ์šฐ ๋น„๊ตํšŸ์ˆ˜๋กœ 5๋งŒ์„ ์•„๋‚„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„์ˆ˜๋ก, ๋ฐ˜๊ฐํšจ๊ณผ๋„ ์ปค์ง‘๋‹ˆ๋‹ค. ๋•Œ๋ฌธ์— ์œ„ ๊ทธ๋ž˜ํ”„๊ฐ€ ์ˆ˜ํ‰์— ๊ฐ€๊นŒ์›Œ์ง€๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋งค์šฐ ์—†์ง€๋งŒ, ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ ๋งค์šฐ ๊ฐ•๋ ฅํ•ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ์‹œ๊ฐ„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ Big O ํ‘œ๊ธฐ๋ฒ•์€ O(log n) ์ž…๋‹ˆ๋‹ค.

๋กœ๊ทธ ๋ฐ‘์ด 2์ธ๊ฐ€์š”? 10์ธ๊ฐ€์š”? ์•„๋‹ˆ๋ฉด ์ž์—ฐ๋กœ๊ทธ์ธ๊ฐ€์š”?

์œ„์˜ ์˜ˆ์ œ์—์„œ๋Š” ๋กœ๊ทธ ๋ฐ‘์ด 2์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Big O ํ‘œ๊ธฐ๋ฒ•์€ ์„ฑ๋Šฅ์˜ ํ˜•ํƒœ์—๋งŒ ์ดˆ์ ์„ ๋งž์ถ”๊ธฐ ๋•Œ๋ฌธ์—, ๋กœ๊ทธ์˜ ์‹ค์ œ ๋ฐ‘์€ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

์œ ์‚ฌ ์„ ํ˜• ์‹œ๊ฐ„(์ค€์„ ํ˜•์‹œ๊ฐ„) Quasilinear time

์—ฌ๋Ÿฌ๋ถ„์ด ๋งŒ๋‚˜๋ณผ ๋˜ ๋‹ค๋ฅธ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” ์œ ์‚ฌ์„ ํ˜• ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. ์œ ์‚ฌ์„ ํ˜• ์‹œ๊ฐ„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์„ ํ˜•์‹œ๊ฐ„๋ณด๋‹ค ์„ฑ๋Šฅ์ด ๋‚˜์ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ‰๋ฐฉ ์‹œ๊ฐ„๋ณด๋‹ค๋Š” ๊ทน์ ์œผ๋กœ ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์—ฌ๋Ÿฌ๋ถ„์ด ๋‹ค๋ฃจ๊ฒŒ ๋  ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์œ ์‚ฌ ์„ ํ˜•์‹œ๊ฐ„์˜ ํ•œ ์˜ˆ๋กœ๋Š” Swift์˜ sort ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์œ ์‚ฌ์„ ํ˜•์‹œ๊ฐ„์˜ Big O ํ‘œ๊ธฐ๋ฒ•์€ O(n log n) ์ž…๋‹ˆ๋‹ค. ์„ ํ˜•์‹œ๊ฐ„๊ณผ ๋กœ๊ทธ์‹œ๊ฐ„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ณฑํ•œ ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค. ๋•Œ๋ฌธ์— ์œ ์‚ฌ ์„ ํ˜•์‹œ๊ฐ„์€ ๋กœ๊ทธ ์‹œ๊ฐ„๊ณผ ์„ ํ˜•์‹œ๊ฐ„ ์‚ฌ์ด์— ๋”ฑ ๋งž์Šต๋‹ˆ๋‹ค. ์„ ํ˜•์‹œ๊ฐ„๋ณด๋‹ค ์„ฑ๋Šฅ์ด ๋‚˜์˜์ง€๋งŒ ์•ž์œผ๋กœ ๋ณด๊ฒŒ ๋  ๋งŽ์€ ๋‹ค๋ฅธ ๋ณต์žก๋„๋ณด๋‹ค๋Š” ๋‚ซ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜ํ”„๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

 

์œ ์‚ฌ์„ ํ˜•์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” ํ‰๋ฐฉ ์‹œ๊ฐ„ ๋ณต์žก๋„์™€ ์œ ์‚ฌํ•œ ํ˜•ํƒœ์˜ ๊ณก์„ ์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ๋น ๋ฅด๊ฒŒ ์˜ฌ๋ผ๊ฐ€์ง€ ์•Š์œผ๋ฏ€๋กœ ๋Œ€๊ทœ๋ชจ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐ ๋”์šฑ ํƒ„๋ ฅ์ ์ž…๋‹ˆ๋‹ค.

 

๋‹ค๋ฅธ ์‹œ๊ฐ„๋ณต์žก๋„ Other time complexities

์—ฌํƒœ๊นŒ์ง€ ๋งŒ๋‚œ 5๊ฐœ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ์ฑ…์—์„œ ๋‹ค๋ฃฐ ์‹œ๊ฐ„๋ณต์žก๋„์ž…๋‹ˆ๋‹ค. ๋‹คํ•ญ์‹ ์‹œ๊ฐ„(Polynomial Time), ์ง€์ˆ˜ ์‹œ๊ฐ„(Exponential Time), ๊ณ„์Šน ์‹œ๊ฐ„(Factorial Time) ๋“ฑ, ๋‹ค๋ฅธ ์‹œ๊ฐ„ ๋ณต์žก๋„๋“ค๋„ ์žˆ์ง€๋งŒ, ํ›จ์”ฌ ๋œ ์ผ๋ฐ˜์ ์ด๊ณ  ์ด ์ฑ…์—์„œ๋Š” ๋…ผ์˜๋˜์ง€ ์•Š์€ ๋” ๋ณต์žกํ•œ ๋ฌธ์ œ๋“ค์„ ๋‹ค๋ฃจ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ค‘์š”ํ•œ ๊ฒƒ์€, ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ์„ฑ๋Šฅ์— ๋Œ€ํ•œ ๋†’์€ ์ˆ˜์ค€์˜ ๋Œ€์š”์ด๋ฉฐ, ์ผ๋ฐ˜์ ์ธ ์ˆœ์œ„์ฒด๊ณ„๋ฅผ ๋„˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์†๋„๋กœ ํŒ๋‹จํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋ง์€, ๋‘ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋™์ผํ•œ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๋”๋ผ๋„ ํ•˜๋‚˜๊ฐ€ ๋‹ค๋ฅธ ํ•˜๋‚˜๋ณด๋‹ค ์›”๋“ฑํžˆ ๋น ๋ฅผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ž‘์€ ๋ฐ์ดํ„ฐ ์„ธํŠธ์—์„œ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” ์‹ค์ œ ์†๋„๋ฅผ ์ธก์ •ํ•˜๋Š” ๋ฐ ์ •ํ™•ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฝ์ž… ์ •๋ ฌ๊ณผ ๊ฐ™์€ ํ‰๋ฐฉ์‹œ๊ฐ„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ณ‘ํ•ฉ์ •๋ ฌ๊ณผ ๊ฐ™์€ ์œ ์‚ฌ์„ ํ˜• ์•Œ๊ณ ๋ฆฌ์ฆ˜๋ณด๋‹ค ๋น ๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ์‚ฝ์ž… ์ •๋ ฌ์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ ์ถ”๊ฐ€์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ด ํ•„์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด ๋ณ‘ํ•ฉ ์ •๋ ฌ์€ ์—ฌ๋Ÿฌ ๋ฐฐ์—ด์„ ํ• ๋‹นํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž‘์€ ๋ฐ์ดํ„ฐ์„ธํŠธ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๊ฑด๋“œ๋ฆฌ๋Š” ์š”์†Œ์˜ ์ˆ˜์™€ ๊ด€๋ จํ•˜์—ฌ ๋น„์‹ธ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์‹œ๊ฐ„๋ณต์žก๋„ ๋น„๊ต Comparing time complexity

1๋ถ€ํ„ฐ n๊นŒ์ง€ ํ•ฉ์„ ์ฐพ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค๊ณ  ํ•ฉ์‹œ๋‹ค.

func sumFromOne(upto n: Int) -> Int {
  var result = 0
  for i in 1...n {
    result += i
  }
  return result
}

sumFromOne(upto: 10000)

 

์œ„ ์ฝ”๋“œ๋Š” 1๋งŒ๋ฒˆ ๋ฐ˜๋ณตํ•˜๊ณ  ๊ฐ’ 50005000์„ ๋ฐ˜ํ™˜ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. O(n)์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ณต๋ฌธ๊ณผ ์ถœ๋ ฅ๊ฒฐ๊ณผ๋ฅผ ์ธ์‡„ํ•˜๋ฏ€๋กœ ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ์ข€ ๊ฑธ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์—ฌ๊ธฐ ๋‹ค๋ฅธ ๋ฒ„์ „์˜ ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

func sumFromOne(upto n: Int) -> Int {
  (1...n).reduce(0, +)
}
sumFromOne(upto: 10000)

์ด ์ฝ”๋“œ๋Š” ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ์—์„œ ๋” ๋นจ๋ฆฌ ๋Œ์•„๊ฐˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ด ์ฝ”๋“œ๋Š” ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋งŒ์•ฝ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ์ค„์ด๊ณ ์ž ํ•œ๋‹ค๋ฉด, ์œ„ ์ฝ”๋“œ ์—ญ์‹œ + ๋ฉ”์†Œ๋“œ๋ฅผ n๋ฒˆ ํ˜ธ์ถœํ•œ๋‹ค๋Š” ์ ์—์„œ O(n) ์ž„์„ ์•Œ๊ฒŒ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‘ ์ฝ”๋“œ Big O ํ‘œ๊ธฐ๋ฒ•์ด ๋™์ผํ•˜์ง€๋งŒ ์œ„ ์ฝ”๋“œ๋Š” ์ด๋ฏธ ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋” ์ž‘์€ ์ƒ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ตœ์ข…์ ์œผ๋กœ ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

func sumFromOne(upto n: Int) -> Int {
  (n + 1) * n / 2
}
sumFromOne(upto: 10000)

 

์ด ๋ฒ„์ „์˜ ํ•จ์ˆ˜๋Š” ํ”„๋ ˆ๋“œ๋ฆญ ๊ฐ€์šฐ์Šค(Fredrick Gauss)๊ฐ€ ์ดˆ๋“ฑํ•™๊ต๋•Œ ์•Œ์•„์ฐจ๋ฆฐ ํŠธ๋ฆญ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰ ์—ฌ๋Ÿฌ๋ถ„์€ ๋‹จ์ˆœํ•œ ์‚ฐ์ˆ ๋กœ ์ด ๋ชจ๋“  ๋ง์…ˆ์„ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ฒ„์ „์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ O(1) ์œผ๋กœ ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜๋„ ์ด๊ธธ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ƒ์ˆ˜์‹œ๊ฐ„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์–ธ์ œ๋‚˜ ๊ฐ€์žฅ ์„ ํ˜ธ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ฒ„์ „์„ ๋ฐ˜๋ณต๋ฌธ ์•ˆ์— ๋„ฃ์„ ๊ฒฝ์šฐ, ์„ ํ˜•์‹œ๊ฐ„์œผ๋กœ ๋๋‚˜์ง€๋งŒ ์ด์ „์˜ O(n) ๋ฒ„์ „์€ ๋Š๋ฆฐ ํ‰๋ฐฉ์‹œ๊ฐ„์˜ ํ•˜๋‚˜์˜ ์™ธ๋ถ€ ๋ฐ˜๋ณต๋ฌธ(just one outer loop away)์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 


๊ณต๊ฐ„๋ณต์žก๋„ Space complexity

์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ํ™•์žฅ์„ฑ์„ ์˜ˆ์ธกํ•˜๋Š”๋ฐ ๋„์›€์ด ๋˜์ง€๋งŒ, ์œ ์ผํ•œ ์ง€ํ‘œ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ๊ณต๊ฐ„๋ณต์žก๋„๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์‹คํ–‰๋˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ž์›์„ ์ธก์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ, ์ปดํ“จํ„ฐ ์ƒ์—์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์œ„ํ•œ ์ž์›์€ ๋ฐ”๋กœ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์„ธ์š”.

 

func printSorted(_ array: [Int]) {
  let sorted = array.sorted()
  for element in sorted {
    print(element)
  }
}

 

์œ„ ํ•จ์ˆ˜๋Š” ์ •๋ ฌ๋œ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค์–ด ์ถœ๋ ฅํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ณต๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ•ด๋‹น ํ•จ์ˆ˜์˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ๋ถ„์„ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

array.sorted() ๋ฉ”์„œ๋“œ๊ฐ€ array ์™€ ๋™์ผํ•œ ์‚ฌ์ด์ฆˆ์˜ ์ƒˆ ๋ฐฐ์—ด์„ ๋งŒ๋“œ๋ฏ€๋กœ, printSorted  ์˜ ๊ณต๊ฐ„๋ณต์žก๋„๋Š” O(n)์ด ๋ฉ๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋„ ๋ฌผ๋ก  ๊ฐ„๋‹จํ•˜๊ณ  ์šฐ์•„ํ•˜์ง€๋งŒ, ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ€๋Šฅํ•œ ์ ๊ฒŒ ํ• ๋‹นํ•˜๊ณ  ์‹ถ์€ ์ƒํ™ฉ์ด ์ƒ๊ธธ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋•Œ ์œ„ ํ•จ์ˆ˜๋ฅผ ์•„๋ž˜์ฒ˜๋Ÿผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

func printSorted(_ array: [Int]) {
  // 1
  guard !array.isEmpty else { return }

  // 2
  var currentCount = 0
  var minValue = Int.min

  // 3
  for value in array {
    if value == minValue {
      print(value)
      currentCount += 1
    }
  }

  while currentCount < array.count {

    // 4
    var currentValue = array.max()!

    for value in array {
      if value < currentValue && value > minValue {
        currentValue = value
      }
    }

    // 5
    for value in array {
      if value == currentValue {
        print(value)
        currentCount += 1
      }
    }

    // 6
    minValue = currentValue
  }
}

์œ„์—์„œ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” ๊ณต๊ฐ„์ œ์•ฝ์„ ์—ผ๋‘ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋ชฉํ‘œ๋Š” ๋ฐฐ์—ด์„ ์—ฌ๋Ÿฌ๋ฒˆ ๋ฐ˜๋ณตํ•˜๊ณ , ๊ฐ ๋ฐ˜๋ณต์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ํ•˜๋Š” ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ๋งŒ์•ฝ ๋ฐฐ์—ด์ด ๋น„์—ˆ์„ ๊ฒฝ์šฐ๋ฅผ ์ฒดํฌํ•ฉ๋‹ˆ๋‹ค. ๋น„์—ˆ๋‹ค๋ฉด ์•„๋ฌด๊ฒƒ๋„ ์ถœ๋ ฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  2. currentCount ๋Š” ์ถœ๋ ฅ๋ฌธ์˜ ์ˆซ์ž๋ฅผ ์ถ”์ ํ•˜๊ณ , minValue ๋Š” ๋งˆ์ง€๋ง‰์œผ๋กœ ์ถœ๋ ฅํ•œ ๊ฐ’์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  3. ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ minValue ์— ์ผ์น˜ํ•˜๋Š” ๋ชจ๋“  ๊ฐ’์„ ์ถœ๋ ฅํ•˜๊ณ , ์ถœ๋ ฅ๋ฌธ์˜ ์ˆซ์ž์— ๋”ฐ๋ผ currentCount ์˜ ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
  4. while ๋ฐ˜๋ณต๋ฌธ์—์„œ, ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ minValue ๋ณด๋‹ค๋Š” ํฐ, ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ์ฐพ๊ณ , ์ด๋ฅผ currentValue ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  5. currentCount๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๋ฉด์„œ ๋ฐฐ์—ด ๋‚ด๋ถ€์˜ ๋ชจ๋“  currentValue ๊ฐ’์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  6. minValue ๊ฐ€ currentValue ๋กœ ์„ธํŒ…๋˜๋ฉด ๋‹ค์Œ ๋ฐ˜๋ณต์—์„œ๋Š” ๊ทธ ๋‹ค์Œ ์ตœ์†Œ๊ฐ’์„ ์ฐพ์Šต๋‹ˆ๋‹ค.

์œ„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ ์€ ์ˆ˜์˜ ๋ณ€์ˆ˜๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋งŒ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋•Œ๋ฌธ์— ๊ณต๊ฐ„๋ณต์žก๋„๋Š” O(1)์ด ๋ฉ๋‹ˆ๋‹ค. ์†Œ์Šค๋ฐฐ์—ด์˜ ์ •๋ ฌ๋œ ํ˜•ํƒœ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋ฐฐ์—ด ์ „์ฒด๋ฅผ ํ• ๋‹นํ•˜๋Š” ์ด์ „ ํ•จ์ˆ˜์™€ ๋Œ€์กฐ์ ์ด ๋ฉ๋‹ˆ๋‹ค.

 

 


๋‹ค๋ฅธ ํ‘œ๊ธฐ๋ฒ• Other notations

์ด์ œ๊นŒ์ง€ Big O ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ธก์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ๊นŒ์ง€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์ด ์ธก์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์ธก์ •๋ฒ•์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด์™ธ์—๋„ ๋‹ค๋ฅธ ํ‘œ๊ธฐ๋ฒ•์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

Big Omega ํ‘œ๊ธฐ๋ฒ•์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ตœ์ƒ์˜ ์‹คํ–‰์‹œ๊ฐ„์„ ์ธก์ •ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ตœ์ƒ์˜ ์ผ€์ด์Šค๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด ๋•Œ๋กœ ์‰ฝ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Big O ํ‘œ๊ธฐ๋ฒ•๋งŒํผ ์œ ์šฉํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

Big Theta ํ‘œ๊ธฐ๋ฒ•์€ ์ตœ์ƒ์˜ ๊ฒฝ์šฐ์™€ ์ตœ์•…์˜ ๊ฒฝ์šฐ๊ฐ€ ๊ฐ™์„ ๊ฒฝ์šฐ ๋Ÿฐํƒ€์ž„์„ ์ธก์ •ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

 

ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ ํ–‰๊ธฐ๋ฐ˜ ์‹คํ–‰ ๋ฒ„๊ทธ Playground line-based execution bug

์ด ์ฑ…์—์„œ๋Š” ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ๋ฅผ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ์กฐ๊ฑดํ•˜์—์„œ Xcode13์—์„œ ํ–‰ ๊ธฐ๋ฐ˜ ์‹คํ–‰์ด ์ž˜๋ชป ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿด ๊ฒฝ์šฐ, ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ ์ฐฝ ํ•˜๋‹จ์— ์œ„์น˜ํ•œ ์‹คํ–‰์ œ์–ด (execution control) ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์„œ ์ „์ฒด ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ค๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

 

ํ•ต์‹ฌ ์š”์•ฝ Key points

  • ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ์ธํ’‹ ์‚ฌ์ด์ฆˆ๊ฐ€ ์ฆ๊ฐ€ํ• ์ˆ˜๋ก, ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‹คํ–‰ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์‹œ๊ฐ„์„ ์ธก์ •ํ•˜๋Š” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค.
  • ์ƒ์ˆ˜์‹œ๊ฐ„, ๋กœ๊ทธ์‹œ๊ฐ„, ์„ ํ˜•์‹œ๊ฐ„, ์œ ์‚ฌ์„ ํ˜•์‹œ๊ฐ„, ํ‰๋ฐฉ์‹œ๊ฐ„์„ ์•Œ๊ณ  ์ด๋ฅผ ๋น„์šฉ์ˆœ์œผ๋กœ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  • ๊ณต๊ฐ„๋ณต์žก๋„๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์ž์›์„ ์ธก์ •ํ•˜๋Š” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค.
  • Big O ํ‘œ๊ธฐ๋ฒ•์€ ์‹œ๊ฐ„๋ณต์žก๋„์™€ ๊ณต๊ฐ„๋ณต์žก๋„๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค.
  • ์‹œ๊ฐ„๊ณผ ๊ณต๊ฐ„ ๋ณต์žก๋„๋Š” ํ™•์žฅ์„ฑ์„ ์ƒ์œ„๋ ˆ๋ฒจ๋กœ ์ธก์ •ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž์ฒด๋ฅผ ์ธก์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ž‘์€ ๋ฐ์ดํ„ฐ์„ธํŠธ์—์„œ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” ๋ณดํ†ต ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์œ ์‚ฌ์„ ํ˜• ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ n์ด ์ž‘์„ ๊ฒฝ์šฐ ํ‰๋ฐฉ์‹œ๊ฐ„๋ณด๋‹ค ์ž‘์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 


๐Ÿ”— ๋ฒˆ์—ญ ์‹œ๋ฆฌ์ฆˆ ๋งํฌ

0๏ธโƒฃ ์„น์…˜ 0. ์‹œ์ž‘ํ•˜๊ธฐ์ „์—

 

[Swift][๋ฒˆ์—ญ] ์Šค์œ„ํ”„ํŠธ์˜ ์ž๋ฃŒ๊ตฌ์กฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ - ์„น์…˜ 0. ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—

์š”์ฆ˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ณต๋ถ€๋ฅผ ํ•˜๋ฉด์„œ Raywenderlich.com ์—์„œ ๋‚˜์˜จ Data Structures & Algorithms in Swift์ด ์ฑ…์„ ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. https://www.raywenderlich.com/books/data-structures-algorithms-in-swift ์ €๋Š” ์ •..

kimdee.tistory.com

1๏ธโƒฃ ์„น์…˜ 1. ์†Œ๊ฐœ Introduction

> ์ฑ•ํ„ฐ 1.์™œ ์ž๋ฃŒ๊ตฌ์กฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ฐฐ์›Œ์•ผํ• ๊นŒ์š”? / ์ฑ•ํ„ฐ 2. ๋ณต์žก๋„  Complexity

 

[Swift][๋ฒˆ์—ญ] ์Šค์œ„ํ”„ํŠธ์˜ ์ž๋ฃŒ๊ตฌ์กฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ - ์„น์…˜ 1. ์†Œ๊ฐœ - ์ฑ•ํ„ฐ1. ์™œ ์ž๋ฃŒ๊ตฌ์กฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„

Raywenderlich.com ์—์„œ ๋‚˜์˜จ Data Structures & Algorithms in Swift ์ฑ…์˜ ๋ฐ๋ชจ ๊ณต๊ฐœ๋ณธ์„ ๋ฒˆ์—ญํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ฆ๊ฒ๊ฒŒ ๋ด์ฃผ์„ธ์š”. https://www.raywenderlich.com/books/data-structures-algorithms-in-swift ์„น์…˜..

kimdee.tistory.com

> ์ฑ•ํ„ฐ3. ์Šค์œ„ํ”„ํŠธ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ Swift Standard Library

 

[Swift][๋ฒˆ์—ญ] ์Šค์œ„ํ”„ํŠธ์˜ ์ž๋ฃŒ๊ตฌ์กฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ - ์„น์…˜ 1. ์†Œ๊ฐœ - ์ฑ•ํ„ฐ3. ์Šค์œ„ํ”„ํŠธ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ S

Raywenderlich.com ์—์„œ ๋‚˜์˜จ Data Structures & Algorithms in Swift ์ฑ…์˜ ๋ฐ๋ชจ ๊ณต๊ฐœ๋ณธ์„ ๋ฒˆ์—ญํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ฆ๊ฒ๊ฒŒ ๋ด์ฃผ์„ธ์š”. https://www.raywenderlich.com/books/data-structures-algorithms-in-swift ์„น์…˜..

kimdee.tistory.com

 

1๏ธโƒฃ ์„น์…˜ 2. ๊ธฐ์ดˆ ์ž๋ฃŒ๊ตฌ์กฐ Elementary Data Structure

> ์ฑ•ํ„ฐ 4. ์Šคํƒ Stacks /  ์ฑ•ํ„ฐ 5. ์Šคํƒ ๋„์ „๊ณผ์ œ Stack Challenges

 

[Swift][๋ฒˆ์—ญ] ์Šค์œ„ํ”„ํŠธ์˜ ์ž๋ฃŒ๊ตฌ์กฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ - ์„น์…˜ 2. ๊ธฐ์ดˆ ์ž๋ฃŒ๊ตฌ์กฐ - ์ฑ•ํ„ฐ4~5. ์Šคํƒ, ์Šคํƒ ๋„์ „

Raywenderlich.com ์—์„œ ๋‚˜์˜จ Data Structures & Algorithms in Swift ์ฑ…์˜ ๋ฐ๋ชจ ๊ณต๊ฐœ๋ณธ์„ ๋ฒˆ์—ญํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ฆ๊ฒ๊ฒŒ ๋ด์ฃผ์„ธ์š”. https://www.raywenderlich.com/books/data-structures-algorithms-in-swift ์„น์…˜..

kimdee.tistory.com

> ์ฑ•ํ„ฐ 6-1. ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ Linked List (์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ์ •์˜, ์š”์†Œ ์ถ”๊ฐ€, ์‚ญ์ œ)

 

 

[Swift][๋ฒˆ์—ญ] ์Šค์œ„ํ”„ํŠธ์˜ ์ž๋ฃŒ๊ตฌ์กฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ - ์„น์…˜ 2. ๊ธฐ์ดˆ ์ž๋ฃŒ๊ตฌ์กฐ - ์ฑ•ํ„ฐ6-1. ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ (์ •

[Swift][๋ฒˆ์—ญ] ์Šค์œ„ํ”„ํŠธ์˜ ์ž๋ฃŒ๊ตฌ์กฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ - ์„น์…˜ 2. ๊ธฐ์ดˆ ์ž๋ฃŒ๊ตฌ์กฐ - ์ฑ•ํ„ฐ6-1. ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ Raywenderlich.com ์—์„œ ๋‚˜์˜จ Data Structures & Algorithms in Swift ์ฑ…์˜ ๋ฐ๋ชจ ๊ณต๊ฐœ๋ณธ์„ ๋ฒˆ์—ญํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ฆ๊ฒ..

kimdee.tistory.com

> ์ฑ•ํ„ฐ 6-2. ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ Linked List (์Šค์œ„ํ”„ํŠธ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ฝœ๋ ‰์…˜ ํ”„๋กœํ† ์ฝœ, ์นด์šฐ Copy-On-Write,  ๋ฐธ๋ฅ˜ ์‹œ๋งจํ‹ฑ)

 

 

[Swift][๋ฒˆ์—ญ] ์Šค์œ„ํ”„ํŠธ์˜ ์ž๋ฃŒ๊ตฌ์กฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ - ์„น์…˜ 2. ๊ธฐ์ดˆ ์ž๋ฃŒ๊ตฌ์กฐ - ์ฑ•ํ„ฐ6-2. ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ

[Swift][๋ฒˆ์—ญ] ์Šค์œ„ํ”„ํŠธ์˜ ์ž๋ฃŒ๊ตฌ์กฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ - ์„น์…˜ 2. ๊ธฐ์ดˆ ์ž๋ฃŒ๊ตฌ์กฐ - ์ฑ•ํ„ฐ6-2. ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ (์Šค์œ„ํ”„ํŠธ ์ฝœ๋ ‰์…˜ ํ”„๋กœํ† ์ฝœ, ๋ฐธ๋ฅ˜ ์‹œ๋งจํ‹ฑ, COW(์นดํ”ผ-์˜จ-๋ผ์ดํŠธ)) Raywenderlich.com ์—์„œ ๋‚˜์˜จ Data Structures &..

kimdee.tistory.com

 

> ์ฑ•ํ„ฐ 7. ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ๋„์ „๊ณผ์ œ Linked List Challenges

 

[Swift][๋ฒˆ์—ญ] ์Šค์œ„ํ”„ํŠธ์˜ ์ž๋ฃŒ๊ตฌ์กฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ - ์„น์…˜ 2. ๊ธฐ์ดˆ ์ž๋ฃŒ๊ตฌ์กฐ - ์ฑ•ํ„ฐ7. ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ๋„์ „

[Swift][๋ฒˆ์—ญ] ์Šค์œ„ํ”„ํŠธ์˜ ์ž๋ฃŒ๊ตฌ์กฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ - ์„น์…˜ 2. ๊ธฐ์ดˆ ์ž๋ฃŒ๊ตฌ์กฐ - ์ฑ•ํ„ฐ7. ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ๋„์ „๊ณผ์ œ Raywenderlich.com ์—์„œ ๋‚˜์˜จ Data Structures & Algorithms in Swift ์ฑ…์˜ ๋ฐ๋ชจ ๊ณต๊ฐœ๋ณธ์„ ๋ฒˆ์—ญํ•˜์˜€์Šต๋‹ˆ๋‹ค..

kimdee.tistory.com

 

 


๋งˆ์น˜๋ฉฐ 

 

์˜ค๋Š˜๋„ ์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

 

๊ถ๊ธˆํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ, ๋„์›€์ด ๋˜์…จ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

ํ˜น์‹œ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ํ”ผ๋“œ๋ฐฑํ•˜์‹ค  ๋‚ด์šฉ ์žˆ๋‹ค๋ฉด ์–ธ์ œ๋“  ๋Œ“๊ธ€๋กœ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

 

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

 

 

 

๋ฐ˜์‘ํ˜•

'๐Ÿ’ป Programming ๊ฐœ๋ฐœ > ๐ŸŽ iOS ๊ฐœ๋ฐœ, Swift' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Swift][๋ฒˆ์—ญ] ์Šค์œ„ํ”„ํŠธ์˜ ์ž๋ฃŒ๊ตฌ์กฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ - ์„น์…˜ 2. ๊ธฐ์ดˆ ์ž๋ฃŒ๊ตฌ์กฐ - ์ฑ•ํ„ฐ4~5. ์Šคํƒ, ์Šคํƒ ๋„์ „๊ณผ์ œ  (0) 2022.05.23
[Swift][๋ฒˆ์—ญ] ์Šค์œ„ํ”„ํŠธ์˜ ์ž๋ฃŒ๊ตฌ์กฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ - ์„น์…˜ 1. ์†Œ๊ฐœ - ์ฑ•ํ„ฐ3. ์Šค์œ„ํ”„ํŠธ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ Swift Standard Library  (0) 2022.05.14
[Swift][๋ฒˆ์—ญ] ์Šค์œ„ํ”„ํŠธ์˜ ์ž๋ฃŒ๊ตฌ์กฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ - ์„น์…˜ 0. ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—  (1) 2022.05.13
[Swift] ์‚ฌ์šฉ์ž ์ปฌ๋Ÿฌ์…‹ ์ถ”๊ฐ€ํ•˜๊ณ  UI Color ํ™•์žฅํ•˜์—ฌ ์ฝ”๋“œ๋กœ ์ ‘๊ทผํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ  (0) 2022.04.04
[Swift] ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•œ Cocoapods ์„ค์น˜ ๋ฐ ์„ค์ • + ์„ค์น˜๊ณผ์ •์— ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊ธธ ๊ฒฝ์šฐ  (0) 2022.03.28

๋Œ“๊ธ€