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์ ๋ฐ๊ฒฌํ ์ ์์ต๋๋ค. ๊ทธ ์ฆ์ ์ฌ๋ฌ๋ถ์ ์๋์ ๊ฐ์ ์ฌํญ์ ์ถ๋ก ํ ์ ์์ต๋๋ค.
- Set์ ์ฌ์ฉํ๊ฒ ๋๋ฉด ์์์ ๋ํ ์์๋ ์๊ดํ์ง ์๋๋ค. Set์ ์ ๋ ฌ๋์ง ์๋ ์ปฌ๋ ์ ์ด๊ธฐ ๋๋ฌธ์.
- Set์ ๋ํ ์ค๋ณต๋ ๊ฐ์ด ์๋ค. ์ฌ์ฉ์๊ฐ ๊ณ ์ ํ ๋ฐ์ดํฐ๋ก ์์ ํ๋ ๊ฒ์ ๊ฐ์ ํ ์ ์๋ค.
- Set์ Value Membership์ ์ฒดํฌํ๊ธฐ ์ ํฉํ๋ฏ๋ก ์์ง๋์ด๊ฐ ์ด๋ฌํ ๋ชฉ์ ์ผ๋ก ๋์ํ ๊ฒ์ ์ ์ ์๋ค.
๋ค์ํ ์๋ฃ๊ตฌ์กฐ์ ์ต์ํด์ง๋ฉด, ์๋ฃ๊ตฌ์กฐ๋ฅผ ํ๋์ ๋จ์๋ก์จ ์ฌ์ฉํ์ฌ ์ฝ๋์ ๋ถ๊ฐ์ ์ธ ๋งฅ๋ฝ์ ์ถ์ถํ ์ ์๊ฒ ๋ฉ๋๋ค. ์ด๊ฒ์ ์ํํธ์จ์ด๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ์ดํดํ ์ ์๋๋ก ๋์์ฃผ๋ ๊ฐ๋ ฅํ ์คํฌ์ด ๋ ๊ฒ์ ๋๋ค.
์๊ธฐ๊ฐ๋ฐ
๊น๋ค๋ก์ด ๋ฌธ์ ํด๊ฒฐ์ ์ํด ์๊ณ ๋ฆฌ์ฆ์ด ์ฌ์ฉํ๋ ์ ๋ต์ ์๊ฒ๋๋ฉด, ์ฝ๋ ๊ฐ์ ์ ์ํ ์์ด๋์ด๋ฅผ ์ป์ ์ ์์ต๋๋ค. Swift์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ฒ์ฉ์ ์ฝ๋ ์ ํ์ ์ ์์ ์ธํธ๊ฐ ์์ต๋๋ค. ์ด๊ฒ๋ค์ด ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ๋ค๋ฃจ์ง๋ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ , ์์ผ๋ก ๋ณด๊ฒ ๋๊ฒ ์ง๋ง, ์ด๋ฌํ ๊ธฐ๋ณธํ์ ์ ๋์ฑ ๋ณต์กํ๊ณ ํน๋ณํ ํํ์ ์ถ์ํ๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํ ํ๋ฅญํ ์ถ๋ฐ์ ์ด ๋ ์ ์์ต๋๋ค. ํ์ค ๋ฐฐ์ด๊ณผ ๋์ ๋๋ฆฌ ๋ณด๋ค ๋ ๋ง์ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์๊ฒ๋๋ฉด ์ฑ์ ๊ตฌ์ถํ๋ ๋ฐ ๋ ๋ง์ ๋๊ตฌ์ ์ฝ๋ ์ ์ ์ป๊ฒ ๋ ๊ฒ์ ๋๋ค.
์ด๋ ํ๋ช ํ ์ฌ๋์ด ๋งํ๊ธธ, ์๊ณ ๋ฆฌ์ฆ์ ์ฐ์ตํ๋ ๊ฒ์ ์์ ๊ฐ๊ฐ ์ค์ผ์ผ์ ์ฐ์ตํ๋ ๋ฐฉ๋ฒ๊ณผ ์ ์ฌํ๋ค๊ณ ํฉ๋๋ค. ๊ธฐ์ด๊ฐ ๋ ๋ค๋ฌ์ด์ง์๋ก ๋์ฑ ๋ณต์กํ ์ํํธ์จ์ด๋ฅผ ๋ค๋ฃจ๋ ๊ฒ์ด ๋์์ง ๊ฒ์ ๋๋ค.
์ด ์ฑ ์ ๋ชฉํ
์ด ์ฑ ์ ์ฐธ๊ณ ์์ด์ ์ฐ์ต์์ ๋๋ค. raywenderlich.com์ ๋ค๋ฅธ ์ฑ ์ ์ต์ํํ๋ค๋ฉด, ์ง์ ์๋ ๊ฒ์ฒ๋ผ ๋๊ปด์ง ๊ฒ์ ๋๋ค. ๊ฐ ์ฑํฐ๋ ๋ช๊ฐ์ง ์ฑ๋ฆฐ์ง๊ฐ ์๋ ์งง์ ์ฑํฐ๋ก ์ด์ด์ง๋๋ค. ๊ฐ ์ฑํฐ์ ๋งจ ๋ง์ง๋ง์์ ์ฑ๋ฆฐ์ง์ ํด๋ต์ ๋ณผ ์ ์์ต๋๋ค. ํด๋ต์ ๋ณด๊ธฐ ์ ์ ์ต๋ํ ์ง์งํ๊ฒ ๋ฌธ์ ํด๊ฒฐ์ ํ๋๋ก ๋ ธ๋ ฅํด๋ณด์ธ์.
์ด ์ฑ ์ 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(n²) ์ ๋๋ค.
์ ํ ์๊ฐ 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
}
}
์์์ ๊ตฌํํ ์ฝ๋๋ ๊ณต๊ฐ์ ์ฝ์ ์ผ๋ํ์์ต๋๋ค. ๋ชฉํ๋ ๋ฐฐ์ด์ ์ฌ๋ฌ๋ฒ ๋ฐ๋ณตํ๊ณ , ๊ฐ ๋ฐ๋ณต์์ ๊ฐ์ฅ ์์ ๊ฐ์ ์ถ๋ ฅํ๋ ๊ฒ์ ๋๋ค.
์ด ์๊ณ ๋ฆฌ์ฆ์ด ํ๋ ์ผ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋ง์ฝ ๋ฐฐ์ด์ด ๋น์์ ๊ฒฝ์ฐ๋ฅผ ์ฒดํฌํฉ๋๋ค. ๋น์๋ค๋ฉด ์๋ฌด๊ฒ๋ ์ถ๋ ฅํ์ง ์์ต๋๋ค.
- currentCount ๋ ์ถ๋ ฅ๋ฌธ์ ์ซ์๋ฅผ ์ถ์ ํ๊ณ , minValue ๋ ๋ง์ง๋ง์ผ๋ก ์ถ๋ ฅํ ๊ฐ์ ์ ์ฅํฉ๋๋ค.
- ์๊ณ ๋ฆฌ์ฆ์ minValue ์ ์ผ์นํ๋ ๋ชจ๋ ๊ฐ์ ์ถ๋ ฅํ๊ณ , ์ถ๋ ฅ๋ฌธ์ ์ซ์์ ๋ฐ๋ผ currentCount ์ ๊ฐ์ ์ ๋ฐ์ดํธํฉ๋๋ค.
- while ๋ฐ๋ณต๋ฌธ์์, ์๊ณ ๋ฆฌ์ฆ์ minValue ๋ณด๋ค๋ ํฐ, ๊ฐ์ฅ ์์ ๊ฐ์ ์ฐพ๊ณ , ์ด๋ฅผ currentValue ์ ์ ์ฅํฉ๋๋ค.
- currentCount๋ฅผ ์ ๋ฐ์ดํธ ํ๋ฉด์ ๋ฐฐ์ด ๋ด๋ถ์ ๋ชจ๋ currentValue ๊ฐ์ ์ถ๋ ฅํฉ๋๋ค.
- 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. ์์ํ๊ธฐ์ ์
1๏ธโฃ ์น์ 1. ์๊ฐ Introduction
> ์ฑํฐ 1.์ ์๋ฃ๊ตฌ์กฐ์ ์๊ณ ๋ฆฌ์ฆ์ ๋ฐฐ์์ผํ ๊น์? / ์ฑํฐ 2. ๋ณต์ก๋ Complexity
> ์ฑํฐ3. ์ค์ํํธ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ Swift Standard Library
1๏ธโฃ ์น์ 2. ๊ธฐ์ด ์๋ฃ๊ตฌ์กฐ Elementary Data Structure
> ์ฑํฐ 4. ์คํ Stacks / ์ฑํฐ 5. ์คํ ๋์ ๊ณผ์ Stack Challenges
> ์ฑํฐ 6-1. ์ฐ๊ฒฐ๋ฆฌ์คํธ Linked List (์ฐ๊ฒฐ๋ฆฌ์คํธ ์ ์, ์์ ์ถ๊ฐ, ์ญ์ )
> ์ฑํฐ 6-2. ์ฐ๊ฒฐ๋ฆฌ์คํธ Linked List (์ค์ํํธ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฝ๋ ์ ํ๋กํ ์ฝ, ์นด์ฐ Copy-On-Write, ๋ฐธ๋ฅ ์๋งจํฑ)
> ์ฑํฐ 7. ์ฐ๊ฒฐ๋ฆฌ์คํธ ๋์ ๊ณผ์ Linked List Challenges
๋ง์น๋ฉฐ
์ค๋๋ ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
๊ถ๊ธํ ์ ์ด ์๋ค๋ฉด ๋๊ธ๋ก, ๋์์ด ๋์ จ๋ค๋ฉด ๊ณต๊ฐ ๋ถํ๋๋ฆฝ๋๋ค.
ํน์ ์์ ํ๊ฑฐ๋ ํผ๋๋ฐฑํ์ค ๋ด์ฉ ์๋ค๋ฉด ์ธ์ ๋ ๋๊ธ๋ก ๋ถํ๋๋ฆฝ๋๋ค.
๊ฐ์ฌํฉ๋๋ค.
๋๊ธ