Jieunny์ ๋ธ๋ก๊ทธ
S4) Unit 11. [์๋ฃ๊ตฌ์กฐ/์๊ณ ๋ฆฌ์ฆ] Algorithm ์ ํ ๋ณธ๋ฌธ
S4) Unit 11. [์๋ฃ๊ตฌ์กฐ/์๊ณ ๋ฆฌ์ฆ] Algorithm ์ ํ
Jieunny 2023. 4. 5. 14:08๐ฃ Greedy Algorithm
๐ญ. Greedy Algorithm
โ๏ธ ์๊ฐ๋ง๋ค ๋น์ฅ ๋์์ ๋ณด์ด๋ ์ต์ ์ ์ํฉ๋ง์ ์ซ์ ์ต์ข ์ ์ธ ํด๋ต์ ๋๋ฌํ๋ ๋ฐฉ๋ฒ
๐ฎ. Greedy Algorithm ๋ฌธ์ ํด๊ฒฐ ๋จ๊ณ
1๏ธโฃ ์ ํ ์ ์ฐจ : ํ์ฌ ์ํ์์์ ์ต์ ์ ํด๋ต์ ์ ํํ๋ค.
2๏ธโฃ ์ ์ ์ฑ ๊ฒ์ฌ : ์ ํ๋ ํด๊ฐ ๋ฌธ์ ์ ์กฐ๊ฑด์ ๋ง์กฑํ๋์ง ๊ฒ์ฌํ๋ค.
3๏ธโฃ ํด๋ต ๊ฒ์ฌ : ์๋์ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์๋์ง ๊ฒ์ฌํ๊ณ , ํด๊ฒฐ๋์ง ์์๋ค๋ฉด ์ ํ ์ ์ฐจ๋ก ๋์๊ฐ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
๐ฏ. Greedy Algorithm ์ ์ฉ ์์
Q. ๊น์ฝ๋ฉ์ ์ค๋๋ ํธ์์ ์์ ์ด์ฌํ ์๋ฅด๋ฐ์ดํธํ๊ณ ์์ต๋๋ค. ์๋์ผ๋ก ์จ ๋ฐํด์ปค๋ ๊ณผ์์ ์๋ฃ๋ฅผ ํ๋์ฉ ์ง์ด ๋ค์๊ณ , ๋ฌผ๊ฑด ๊ฐ๊ฒฉ์ ์ด 4,040์์ด ๋์์ต๋๋ค. ๋ฐํด์ปค๋ ๊ณ์ฐํ๊ธฐ ์ํด 5,000์์ ๋ด๋ฐ๋ฉฐ, ๊ฑฐ์ค๋ฆ๋์ ๋์ ์ ๊ฐ์๋ฅผ ์ต์ํ์ผ๋ก ํ์ฌ ๊ฑฐ์ฌ๋ฌ ๋ฌ๋ผ๊ณ ํ์์ต๋๋ค. ์ด๋ ๊น์ฝ๋ฉ์ ์ด๋ป๊ฒ ๊ฑฐ์ฌ๋ฌ ์ฃผ์ด์ผ ํ ๊น์?
A.
1๏ธโฃ ์ ํ ์ ์ : ๊ฑฐ์ค๋ฆ๋์ ๋์ ๊ฐ์๋ฅผ ์ค์ด๊ธฐ ์ํด ํ์ฌ ๊ฐ์ฅ ๊ฐ์น๊ฐ ๋์ ๋์ ์ ์ฐ์ ์ ํํ๋ค.
2๏ธโฃ ์ ์ ์ฑ ๊ฒ์ฌ : 1๋ฒ ๊ณผ์ ์ ํตํด ์ ํ๋ ๋์ ๋ค์ ํฉ์ด ๊ฑฐ์ฌ๋ฌ ์ค ๊ธ์ก์ ์ด๊ณผํ๋์ง ๊ฒ์ฌํ๋ค. ์ด๊ณผํ๋ฉด ๊ฐ์ฅ ๋ง์ง๋ง์ ์ ํํ ๋์ ์ ์ญ์ ํ๊ณ , 1๋ฒ์ผ๋ก ๋์๊ฐ ํ ๋จ๊ณ ์์ ๋์ ์ ์ ํํ๋ค.
3๏ธโฃ ํด๋ต ๊ฒ์ฌ : ์ ํ๋ ๋์ ๋ค์ ํฉ์ด ๊ฑฐ์ฌ๋ฌ ์ค ๊ธ์ก๊ณผ ์ผ์นํ๋์ง ๊ฒ์ฌํ๋ค. ์ก์๊ฐ ๋ถ์กฑํ๋ฉด 1๋ฒ ๊ณผ์ ๋ถํฐ ๋ค์ ๋ฐ๋ณตํ๋ค.
=> ๊ฐ์ฅ ๊ฐ์น๊ฐ ๋์ ๋์ ์ธ 500์ 1๊ฐ๋ฅผ ๋จผ์ ๊ฑฐ์ฌ๋ฌ ์ฃผ๊ณ ์์ก์ ํ์ธํ ๋ค, ์ดํ 100์ 4๊ฐ, 50์ 1๊ฐ, 10์ 1๊ฐ์ ์์๋ก ๊ฑฐ์ฌ๋ฌ์ค๋ค.
๐ฐ. Greedy Algorithm์ ํน์ง
1๏ธโฃ ํ์์ ์ ํ ์์ฑ(Greedy Choice Property) : ์์ ์ ํ์ด ์ดํ์ ์ ํ์ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
2๏ธโฃ ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ(Optimal Substructure) : ๋ฌธ์ ์ ๋ํ ์ต์ข ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ถ๋ถ ๋ฌธ์ ์ ๋ํ ์ต์ ๋ฌธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌ์ฑ๋๋ค.
=> ํญ์ ์ต์ ์ ๊ฒฐ๊ณผ๋ฅผ ๋์ถํ๋ ๊ฒ์ ์๋์ง๋ง, ์ด๋ ์ ๋ ์ต์ ์ ๊ทผ์ฌํ ๊ฐ์ ๋น ๋ฅด๊ฒ ๋์ถํ ์ ์๋ค.
๐ฃ Algorithm ๊ตฌํ์ ๊ธฐ์ด
โ๏ธ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ฅผ ํผ๋ค = ๋ด๊ฐ ์๊ฐํ ๋ฌธ์ ํด๊ฒฐ ๊ณผ์ ์ ์ปดํจํ ์ฌ๊ณ ๋ก ๋ณํํด์ ์ฝ๋๋ก ๊ตฌํํ๋ ๊ฒ
โฐ ์ ํํ๊ณ ๋น ๋ฅผ์๋ก ๊ตฌํ ๋ฅ๋ ฅ์ด ์ข๋ค๊ณ ํ๋ค(์ ํด์ง ์๊ฐ ์์ ๋น ๋ฅด๊ฒ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฅ๋ ฅ)
๐ญ. ์์ ํ์
โ๏ธ ๋จ์ํ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ํ์ํ๋ ๊ฒฝ์ฐ๋ก, ๋ชจ๋ ๋ฌธ์ ๋ ์์ ํ์์ผ๋ก ํ ์ ์๋ค.
โฐ ๋จ์ํ๊ณ ๋ฌด์ํ์ง๋ง ๋ต์ด ๋ฌด์กฐ๊ฑด ์๋ค๋ ์ฅ์ ์ด ์๋ค.
โฐ ํ์ง๋ง ํ์ํด์ผ ํ ๋ฐ์ดํฐ์ ์์ด ๋ง์์ง ๊ฒฝ์ฐ ์์ ํ์ ์๊ณ ๋ฆฌ์ฆ์ ๋นํจ์จ์ ์ด๋ค.
โฐ ๋๋ฌธ์ ์์ ํ์์ ๋ฌธ์ ๋ฅผ ํ ์ ์๋ ๊ฐ๋ฅํ ๋ชจ๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ คํ ํ ํจ์จ์ ์ผ๋ก ๋์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด ์์ ํ์๋ฐ์ ์๋ค๊ณ ํ๋จ๋ ๋ ์ ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
โฐ Brute Force(์กฐ๊ฑด/๋ฐ๋ณต์ ์ฌ์ฉํด ํด๊ฒฐ), ์ฌ๊ท, ์์ด, DFS/BFS ๋ฑ์ด ์๋ค.
๐ฎ. ์๋ฎฌ๋ ์ด์
โ๏ธ ๋ชจ๋ ๊ณผ์ ๊ณผ ์กฐ๊ฑด์ด ์ ์๋์ด, ๊ทธ ๊ณผ์ ์ ๊ฑฐ์น ๊ฒฐ๊ณผ๊ฐ ๋ฌด์์ธ์ง ํ์ธํ๋ ๋ฐฉ๋ฒ
โฐ ๋ฌธ์ ์์ ์ค๋ช ํด ์ค ๋ก์ง ๊ทธ๋๋ก ์ฝ๋๋ก ์์ฑํ๋ฉด ๋์ด์ ๋ฌธ์ ํด๊ฒฐ์ ๋ ์ฌ๋ฆฌ๋ ๊ฒ ์์ฒด๋ ์ฌ์ธ ์ ์์ผ๋ ๊ธธ๊ณ ์์ธํ์ฌ ์ฝ๋๋ก ์ฎ๊ธฐ๋ ์์ ์ด ๊น๋ค๋ก์ธ ์ ์๋ค.
โ๏ธ ์๋ฎฌ๋ ์ด์ ์์
Q. ๋ฌด์์ ์ํ ์กฐ์ง์ธ์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง, ๋น๋ฐ์ค๋ฌ์ด ๋น๋ฐ ์กฐ์ง '์ํฌ๋ฆฟ ์์ด์ ์'๋ ์ํต์ ํ์ ์ ๋จ๊ธฐ์ง ์๊ธฐ ์ํด 3์ผ์ ํ ๋ฒ์ฉ ์ฌ๋ผ์ง๋ ๋ฉ์ ์ ์ฑ์ ์ฌ์ฉํ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ด๋ถ ์คํ์ด์ ๋ํ ์ ์ถ๋ก ์ธํด ๋ํํ ๋ ์กฐ๊ฑด์ ์ฌ๋ฌ ๊ฐ ๋ถ์ด๊ธฐ๋ก ํ์ต๋๋ค. ํด๋น ์กฐ๊ฑด์ ์ด๋ ์ต๋๋ค.
- ์บ๋ฆญํฐ๋ ์์ด๋, ๋๋ค์, ์์์ด ์๋ฌธ์ผ๋ก ๋ด๊ธด ๋ฐฐ์ด๋ก ๊ตฌ๋ถํฉ๋๋ค.
- ์์์ 'true', 'false', 'null' ์ค ํ๋์ ๋๋ค.
- ์์์ด ์ ์ค ํ๋๊ฐ ์๋๋ผ๋ฉด ์์ด๋, ๋๋ค์, ์์, ๋ํ ๋ด์ฉ์ ๋ฌธ์์ด์ ์ ๋ถ X๋ก ๋ฐ๊ฟ๋๋ค.
- ์์ด๋์ ๋๋ค์์, ๊ธธ์ด๋ฅผ 2์ง์๋ก ๋ฐ๊พผ ๋ค, ๋ฐ๋ ์ซ์๋ฅผ ๋ํฉ๋๋ค.
- ์บ๋ฆญํฐ์ ๋ํ ๋ด์ฉ์ ๊ตฌ๋ถํ ๋ ๊ณต๋ฐฑ:๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถํฉ๋๋ค: ['Blue', 'Green', 'null'] : hello.
- ๋์ด์ฐ๊ธฐ ํฌํจ, ๋ํ ๋ด์ฉ์ด 10๊ธ์๊ฐ ๋์ ๋, ๋ด์ฉ์ .,-+ ์ด ์๋ค๋ฉด ์ญ์ ํฉ๋๋ค.
- ๋์ด์ฐ๊ธฐ ํฌํจ, ๋ํ ๋ด์ฉ์ด 10๊ธ์๊ฐ ๋์ง ์์ ๋, ๋ด์ฉ์ .,-+@#$%^&*?! ์ด ์๋ค๋ฉด ์ญ์ ํฉ๋๋ค.
- ๋์ด์ฐ๊ธฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฌธ์์ด์ ๋ฐ์ ํฉ๋๋ค: 'abc' -> 'cba'
- ๋์ด์ฐ๊ธฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ์๋ฌธ์์ ๋๋ฌธ์๋ฅผ ๋ฐ์ ํฉ๋๋ค: 'Abc' -> 'aBC'
์ํฌ๋ฆฟ ์์ด์ ์์ ๋ฐ๋๊ธฐ ์ ๋ํ๋ฅผ ๋ฐ์, ํด๋น ์กฐ๊ฑด๋ค์ ์ ๋ถ ์๋ ดํ์ฌ ์์ ํ ๋ํ๋ฅผ ๊ฐ์ฒด์ ํค์ ๊ฐ์ผ๋ก ๋ด์ ๋ฐํํ์ธ์. ๊ฐ์ ์บ๋ฆญํฐ๊ฐ ๋ ๋ฒ ๋งํ๋ค๋ฉด, ๊ณต๋ฐฑ์ ํ ์นธ ๋ ์ฑ๋ก ๋ํ ๋ด์ฉ์ ์ถ๊ฐ๋์ด์ผ ํฉ๋๋ค. ๋ํ๋ ๋ฌธ์์ด๋ก ์ ๊ณต๋๋ฉฐ, ํ์ดํ- ์ผ๋ก ๊ตฌ๋ถ๋ฉ๋๋ค.
๋ฌธ์์ด์ ์ ๋ถ ์ฑ๊ธ ์ฟผํฐ๋ก ์ ๊ณต๋๋ฉฐ, ์ ์ฒด๋ฅผ ๊ฐ์ธ๋ ๋ฌธ์์ด์ ๋๋ธ ์ฟผํฐ๋ก ์ ๊ณต๋ฉ๋๋ค.
์: "['Blue', 'Green', 'null'] : 'hello. im G.' - ['Black', 'red', 'true']: '? what? who are you?'"
โฐ ๋ฌธ์ ์ ๋ํ ์ดํด๋ฅผ ๋ฐํ์ผ๋ก ์กฐ๊ฑด์ ํ๋๋ ๋น ์ง์์ด ์ฒ๋ฆฌํด์ผ ์ ๋ต์ ๊ตฌํ ์ ์๋ค.
โฐ ์กฐ๊ฑด์ ํ๋๋ผ๋ ๋์น๋ฉด ํต๊ณผํ ์ ์๊ณ , ๊ธธ์ด์ง ์ฝ๋ ๋๋ฌธ์ ๋ณต์กํด์ง ์ ์๋ค.
๐ฃ Dynamic Algorithm
๐ญ. Dynamic Algorithm(DP)
โ๏ธ ์ฃผ์ด์ง ๋ฌธ์ ๋ฅผ ์ฌ๋ฌ ๊ฐ์ (์์) ํ์ ๋ฌธ์ ๋ก ๋๋์ด ํ๊ณ , ํ์ ๋ฌธ์ ๋ค์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๊ฒฐํฉํ์ฌ ์ต์ข ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ
โฐ ํ์ ๋ฌธ์ ๋ฅผ ๊ณ์ฐํ ๋ค ๊ทธ ํด๊ฒฐ์ฑ ์ ์ ์ฅํ๊ณ , ๋์ค์ ๋์ผํ ํ์ ๋ฌธ์ ๋ฅผ ๋ง๋ ๊ฒฝ์ฐ ์ ์ฅ๋ ํด๊ฒฐ์ฑ ์ ์ ์ฉํด ์ฐ์ฐ์ ์ค์ธ๋ค => ํ๋์ ๋ฌธ์ ๋ ํ ๋ฒ๋ง ํ๋๋ก ํ๋ ์๊ณ ๋ฆฌ์ฆ
๐ฎ. Dynamic Algorithm์ ์ฌ์ฉ ์กฐ๊ฑด
1๏ธโฃ Overlapping Sub-problems : ํฐ ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋ก ๋๋ ์ ์๊ณ , ์ด ์์ ๋ฌธ์ ๊ฐ ์ค๋ณตํด์ ๋ฐ๊ฒฌ๋๋ค.
โ๏ธ ํฐ ๋ฌธ์ ๋ก๋ถํฐ ๋๋์ด์ง ์์ ๋ฌธ์ ๋ ํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ ์ฌ๋ฌ ๋ฒ ๋ฐ๋ณตํด์ ์ฌ์ฉ๋ ์ ์์ด์ผ ํ๋ค.
โฐ ๋ํ์ ์ธ ๋ฌธ์ ๋ 'ํผ๋ณด๋์น ์์ด'
โฐ ๊ฐ ํผ๋ณด๋์น(n)์ ๊ฐ์ (n-2) + (n-1) ์ด๋ฏ๋ก ์ด๋ฅผ ์ด์ฉํด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
โฐ ์์ ๋ฌธ์ ์ ๊ฒฐ๊ณผ๋ฅผ ํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ๋ฌ ๋ฒ ๋ฐ๋ณตํ์ฌ ์ฌ์ฉํ ์ ์์ ๋, ๋ถ๋ถ ๋ฌธ์ ์ ๋ฐ๋ณต(Overlapping Sub-problems)์ด๋ผ๋ ์กฐ๊ฑด์ ๋ง์กฑํ๋ค.
๐จ ์ฃผ์ด์ง ๋ฌธ์ ๋ฅผ ๋จ์ํ ๋ฐ๋ณต ๊ณ์ฐํ์ฌ ํด๊ฒฐํ๋ ๊ฒ์ด ์๋๋ผ, ์์ ๋ฌธ์ ์ ๊ฒฐ๊ณผ๊ฐ ํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ์ ์ฌ๋ฌ ๋ฒ ์ฌ์ฉ๋ ์ ์์ด์ผ ํ๋ค.
2๏ธโฃ Optimal Substructure : ์์ ๋ฌธ์ ์์ ๊ตฌํ ์ ๋ต์ ๊ทธ๊ฒ์ ํฌํจํ๋ ํฐ ๋ฌธ์ ์์๋ ๊ฐ๋ค.
=> ์์ ๋ฌธ์ ์์ ๊ตฌํ ์ ๋ต์ ํฐ ๋ฌธ์ ์์๋ ์ฌ์ฉํ ์ ์๋ค.
โ๏ธ ์ ๋ต์ ์ต์ ์ ํด๊ฒฐ ๋ฐฉ๋ฒ(Optimal solution)์ ์๋ฏธํ๋ฉฐ, ์ด๋ฅผ ๊ตฌํ ๋ ์ฃผ์ด์ง ๋ฌธ์ ์ ์์ ๋ฌธ์ ๋ค์ ์ต์ ์ ํด๋ฅผ ์ฐพ์์ผํ๋ค. ์์ ๋ฌธ์ ๋ค์ ์ต์ ์ ํด๋ฅผ ๊ฒฐํฉํ๋ฉด ๊ฒฐ๊ตญ ์ ์ฒด ๋ฌธ์ ์ ์ต์ ์ ํด๋ฒ์ ๊ตฌํ ์ ์๋ค.
โฐ ๊ฐ์ฅ ๋ํ์ ์ธ ์์๋ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ๋ฌธ์ ์ด๋ค.
Q. A์์ D๋ก ๊ฐ๋ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ์๋ผ.
A. ๊ทธ์ ์์ ๋ฌธ์ ์ธ A์์ C๋ก ๊ฐ๋ ์ต๋จ ๊ฒฝ๋ก, ๋ ๊ทธ์ ์์ ๋ฌธ์ ์ธ A์์ B๋ก ๊ฐ๋ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ฉด ๊ฒฐ๊ตญ A์์ D๋ก ๊ฐ๋ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ ์ ์๊ฒ ๋๋ค.
๐ฃ Algorithm์ ์ ํ ์์
๐ญ. Greedy Algorithm - ๊ฑฐ์ค๋ฆ๋
Q. ํ๋ก๋ ์์ฃผ JOI ์กํ์ ์์ ๋ฌผ๊ฑด์ ์ฐ๋ค. JOI ์กํ์ ์๋ ์๋์ผ๋ก 500์, 100์, 50์, 10์, 5์, 1์์ด ์ถฉ๋ถํ ์๊ณ , ์ธ์ ๋ ๊ฑฐ์ค๋ฆ๋ ๊ฐ์๊ฐ ๊ฐ์ฅ ์ ๊ฒ ์๋์ ์ค๋ค. ํ๋ก๊ฐ JOI ์กํ์ ์์ ๋ฌผ๊ฑด์ ์ฌ๊ณ ์นด์ดํฐ์์ 1000์ ์งํ๋ฅผ ํ ์ฅ ๋์ ๋, ๋ฐ์ ์๋์ ํฌํจ๋ ์๋์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๊ณ , ์ ๋ ฅ์ด 380์ผ ๊ฒฝ์ฐ ์ถ๋ ฅ์ ๊ตฌํด๋ผ.
A. ์ ๋ ฅ์ด 380์ด๋ฉด ๊ฑฐ์ค๋ฆ๋์ 620์์ด๋ค => 500์ 1๊ฐ, 100์ 1๊ฐ, 10์ 2๊ฐ๋ก ์ด 4๊ฐ๊ฐ ๊ฐ์ฅ ์ ๊ฒ ์๋์ ๊ฑฐ์ฌ๋ฌ ๋ฐ๋ ๋ฐฉ๋ฒ
function keepTheChange(input) {
//1000์์ง๋ฆฌ ์งํ๋ฅผ ๋๋ค๋ ๊ฐ์ ์ด ์๊ณ , ์
๋ ฅ๊ฐ์ผ๋ก๋ ์ง๋ถํด์ผ ํ ๊ธ์ก์ด ๋ค์ด์ต๋๋ค.
let change = Number(1000 - input);
//์นด์ดํธํ๊ธฐ ์ํด ๋ณ์ count์ 0์ ํ ๋นํฉ๋๋ค.
let count = 0;
//์
๋ ฅ๊ฐ์ ๋ฐฐ์ด์ด ๋ค์ด์ค์ง ์์ผ๋ฏ๋ก ์ง์ ๋ฐฐ์ด์ ๋ง๋ค์ด์ค๋๋ค.
const joiCoins = [500, 100, 50, 10, 5, 1];
//๋ง๋ ๋ฐฐ์ด์ ๊ฐ์๋งํผ๋ง ๋๋ ค์ค์ผ ํฉ๋๋ค.
for(let i = 0; i < joiCoins.length; i++){
//๊ฑฐ์ค๋ฆ๋์ด 0์์ด ๋๋ฉด for ๋ฌธ์ ๋ฉ์ถฅ๋๋ค.
if(change === 0) break;
//๊ฑฐ์ค๋ฆ๋๊ณผ ์๋์ ๋๋ ๋ชซ์ ์
๋๋ค.(์ฐ์ธ ์๋์ ๊ฐ์ ์ธ๊ธฐ)
count += Math.floor(Number(change/joiCoins[i]));
//๊ฑฐ์ค๋ฆ๋์ ์๋์ผ๋ก ๋๋ ๋๋จธ์ง๋ฅผ ์ฌํ ๋นํฉ๋๋ค.
change %= joiCoins[i];
}
//count๋ฅผ ๋ฆฌํดํฉ๋๋ค.
return count;
}
โฐ ๊ฑฐ์ค๋ฆ๋ ๊ฐ์๊ฐ ๊ฐ์ฅ ์ ๊ฒ ์ค์ผํ๊ธฐ ๋๋ฌธ์ ๊ธ์ก์ด ํฐ ์๋๋ถํฐ ๊ณ์ฐ์ ํด์ผํ๋ค => ๊ธ์ก์ด ํฐ ์๋ ์์๋๋ก ๋ฐฐ์ด์ ๋ง๋ค์ด์ค๋ค.
โฐ for๋ฌธ์์ ๋ฐฐ์ด์ ์์ ๊ฐ์๋งํผ ๋ฐ๋ณต๋ฌธ์ ๋๊ณ , if๋ฌธ์์ ์๋์ด 0์์ด ๋๋ฉด for๋ฌธ์ ๋ฉ์ถ๋ค.
๐ฎ. Brute Force Algorithm
โ๏ธ ํ๋ํ๋ ๋์ ํ๋ ๋ฌด์ฐจ๋ณ ๋์ ๋ฐฉ๋ฒ
โฐ ๊ณต๊ฐ, ์๊ฐ ๋ณต์ก๋์ ์์๋ฅผ ๊ณ ๋ คํ์ง ์๊ณ ์ต์ ์ ์๋๋ฆฌ์ค๋ฅผ ์ทจํ๋๋ผ๋ ์๋ฃจ์ ์ ์ฐพ์ผ๋ ค๊ณ ํ๋ ๋ฐฉ๋ฒ
โฐ ํ๋ก์ธ์ค ์๋๋ฅผ ๋์ผ ์ ์๋ ๋ค๋ฅธ ์๊ณ ๋ฆฌ์ฆ์ด ์๋ ๊ฒฝ์ฐ
โฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์ฌ๋ฌ ์๋ฃจ์ ์ด ์๊ณ ๊ฐ ์๋ฃจ์ ์ ํ์ธํด์ผ ํ๋ ๊ฒฝ์ฐ
โฐ ๋ฐ์ดํฐ์ ๋ฒ์๊ฐ ์ปค์ง์๋ก ๋นํจ์จ์ ์ด๋ค.
โ๏ธ Brute Force Algorithm์ ํ๊ณ
โฐ ๋ฌธ์ ์ ๋ณต์ก๋์ ๋งค์ฐ ๋ฏผ๊ฐํด์, ๋ฌธ์ ๊ฐ ๋ณต์กํด์ง์๋ก ๋ง์ ์์์ ํ์๋ก ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด ๋ ์ ์๋ค.
โ๏ธ Brute Force Algorithm์ ์ฌ์ฉํ๋ ๊ณณ
1๏ธโฃ ์์ฐจ ๊ฒ์ ์๊ณ ๋ฆฌ์ฆ
โฐ 0๋ถํฐ ์ฐพ๊ณ ์ ํ๋ ๊ฐ์ด ์๋ ์ธ๋ฑ์ค๊น์ง ์์ฐจ์ ์ผ๋ก ๊ฒ์ํ๋ค.
function SequentialSearch2(arr, k) {
// ๊ฒ์ ํค K๋ฅผ ์ฌ์ฉํ์ฌ ์์ฐจ ๊ฒ์์ ๊ตฌํ
// ์
๋ ฅ: n๊ฐ์ ์์๋ฅผ ๊ฐ๋ ๋ฐฐ์ด A์ ๊ฒ์ ํค K
// ์ถ๋ ฅ: K ๊ฐ๊ณผ ๊ฐ์ ์์ ์ธ๋ฑ์ค ๋๋ ์์๊ฐ ์์ ๋ -1
let n = arr.length; // ํ์ฌ์ ๋ฐฐ์ด ๊ฐ์๋ฅผ n์ ํ ๋นํฉ๋๋ค.
arr[n] = k; // ๊ฒ์ ํค๋ฅผ arr n ์ธ๋ฑ์ค์ ํ ๋นํฉ๋๋ค.
let i = 0; // while ๋ฐ๋ณต๋ฌธ์ ์ด๊น๊ฐ์ ์ง์ ํ๊ณ
while (arr[i] !== k) { // ๋ฐฐ์ด์ ๊ฐ์ด k์ ๊ฐ์ง ์์ ๋๊น์ง ๋ฐ๋ณตํฉ๋๋ค.
i = i + 1; // k์ ๊ฐ์ง ์์ ๋ i๋ฅผ +1 ํฉ๋๋ค.
}
if (i < n) { // i๊ฐ k๋ฅผ ํ ๋นํ๊ธฐ ์ ์ ๋ฐฐ์ด๊ฐ์๋ณด๋ค ์ ๋ค๋ฉด(๋ฐฐ์ด ์์ k ๊ฐ์ด ์๋ค๋ฉด)
return i; // i๋ฅผ ๋ฐํํฉ๋๋ค.
} else {
return -1; // -1์ ๋ฐํํฉ๋๋ค.
}
}
2๏ธโฃ ๋ฌธ์์ด ๋งค์นญ ์๊ณ ๋ฆฌ์ฆ
โฐ ๊ธธ์ด๊ฐ n์ธ ์ ์ฒด ๋ฌธ์์ด์ด ๊ธธ์ด๊ฐ m์ธ ๋ฌธ์์ด ํจํด์ ํฌํจํ๋ ์ง ๊ฒ์ํ๋ค.
function BruteForceStringMatch(arr, patternArr) {
// Brute Force ๋ฌธ์์ด ๋งค์นญ์ ๊ตฌํํฉ๋๋ค.
// ์
๋ ฅ: n๊ฐ์ ๋ฌธ์ ํ
์คํธ๋ฅผ ๋ํ๋ด๋ ๋ฐฐ์ด T, m๊ฐ์ ๋ฌธ์ ํจํด์ ๋ํ๋ด๋ ๋ฐฐ์ดP
// ์ถ๋ ฅ: ์ผ์นํ๋ ๋ฌธ์์ด์ด ์์ผ๋ฉด ์ฒซ ๋ฒ์งธ ์ธ๋ฑ์ค๋ฅผ ๋ฐํํฉ๋๋ค. ๊ฒ์์ ์คํจํ ๊ฒฝ์ฐ -1์ ๋ฐํํฉ๋๋ค.
let n = arr.length;
let m = patternArr.length;
for (let i = 0; i <= n - m; i++) {
// ์ ์ฒด ์์ ๊ฐ์์์ ํจํด ๊ฐ์๋ฅผ ๋บ ๋งํผ๋ง ๋ฐ๋ณตํฉ๋๋ค. ๊ทธ ์๊ฐ ๋ง์ง๋ง ๋น๊ต ์์์ด๊ธฐ ๋๋ฌธ์
๋๋ค.
// i ๋ฐ๋ณต๋ฌธ์ ํจํด๊ณผ ๋น๊ต์ ์์น๋ฅผ ์ก๋ ๋ฐ๋ณต๋ฌธ์
๋๋ค.
let j = 0;
// j๋ ์ ์ฒด์ ํจํด์ ์์ ํ๋ํ๋๋ฅผ ๋น๊ตํ๋ ๋ฐ๋ณต๋ฌธ์
๋๋ค.
while (j < m && patternArr[j] === arr[i + j]) {
// j๊ฐ ํจํด์ ๊ฐ์๋ณด๋ค ์ปค์ง๋ฉด ์ ๋๊ธฐ ๋๋ฌธ์ ๊ฐ์๋งํผ๋ง ๋ฐ๋ณตํฉ๋๋ค.
// ํจํด์์๋ j ์ธ๋ฑ์ค์ ์ ์ฒด์์๋ i + j ์ธ๋ฑ์ค์ ๊ฐ์ด ๊ฐ์์ง ํ๋จํฉ๋๋ค.
// ๊ฐ์ ๋ j์ +1 ํฉ๋๋ค.
j = j + 1;
}
if (j === m) {
// j์ ํจํด ์๊ฐ ๊ฐ๋ค๋ ๊ฒ์ ํจํด์ ๋ฌธ์์ด๊ณผ ์์ ํ ๊ฐ์ ๋ถ๋ถ์ด ์กด์ฌํ๋ค๋ ์๋ฏธ์
๋๋ค.
// ์ด๋์ ๋น๊ตํ๋ ์์น๋ฅผ ๋ฐํํฉ๋๋ค.
return i;
}
}
return -1;
}
3๏ธโฃ ์ ํ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ
โฐ ์ ์ฒด ๋ฐฐ์ด์ ๊ฒ์ํ์ฌ ํ์ฌ ์์์ ๋น๊ตํ๊ณ ์ปฌ๋ ์ ์ด ์์ ํ ์ ๋ ฌ๋ ๋๊น์ง ํ์ฌ ์์๋ณด๋ค ๋ ์๊ฑฐ๋ ํฐ ์์(์ค๋ฆ์ฐจ์ ๋๋ ๋ด๋ฆผ์ฐจ์์ ๋ฐ๋ผ)๋ฅผ ๊ตํํ๋ ์๊ณ ๋ฆฌ์ฆ
function SelectionSort(arr) {
// ์ฃผ์ด์ง ๋ฐฐ์ด์ Selection Sort๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํฉ๋๋ค.
// ์
๋ ฅ: ์ ๋ ฌ ํ ์ ์๋ ์์์ ๋ฐฐ์ด A
// ์ถ๋ ฅ: ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋ ๋ฐฐ์ด
for (let i = 0; i < arr.length - 1; i++) {
// ๋ฐฐ์ด์ 0๋ฒ์งธ ์ธ๋ฑ์ค๋ถํฐ ๋ง์ง๋ง์ธ๋ฑ์ค๊น์ง ๋ฐ๋ณตํฉ๋๋ค.
// ํ์ฌ ๊ฐ ์์น์ ๊ฐ์ฅ ์์ ๊ฐ์ ๋ฃ์ ๊ฒ์
๋๋ค.
let min = i;
// ํ์ฌ ์ธ๋ฑ์ค๋ฅผ ์ต์๊ฐ์ ์ธ๋ฑ์ค๋ฅผ ๋ํ๋ด๋ ๋ณ์์ ํ ๋นํฉ๋๋ค.
for (let j = i + 1; j < arr.length; j++) {
// ํ์ฌ i์ +1์ j๋ก ๋ฐ๋ณต๋ฌธ์ ์ด๊ธฐํํ๊ณ i ์ดํ์ ๋ฐฐ์ด์์์ ๋น๊ตํ๋ ๋ฐ๋ณต๋ฌธ์ ๊ตฌ์ฑํฉ๋๋ค.
if (arr[j] < arr[min]) {
// j ์ธ๋ฑ์ค์ ๋ฐฐ์ด ๊ฐ์ด ํ์ฌ ์ธ๋ฑ์ค์ ๋ฐฐ์ด ๊ฐ๋ณด๋ค ์๋ค๋ฉด
min = j;
// j ์ธ๋ฑ์ค๋ฅผ ์ต์๋ฅผ ๋ํ๋ด๋ ์ธ๋ฑ์ค๋ก ํ ๋นํฉ๋๋ค.
}
}
// ๋ฐ๋ณต๋ฌธ์ด ๋๋ฌ์ ๋(๋ชจ๋ ๋น๊ต๊ฐ ๋๋ฌ์ ๋)
// min์๋ ์ต์๊ฐ์ ์ธ๋ฑ์ค๊ฐ ๋ค์ด์์ต๋๋ค.
// i ๊ฐ๊ณผ ์ต์๊ฐ์ ๋ฐ๊ฟ์ ํ ๋นํฉ๋๋ค.
let temp = arr[i];
arr[i] = arr[min];
arr[min] = temp;
}
// ๋ชจ๋ ๋ฐ๋ณต๋ฌธ์ด ๋๋๋ฉด ์ ๋ ฌ๋ ๋ฐฐ์ด์ ๋ฐํํฉ๋๋ค.
return arr;
}
๐ฏ. Dynamic Programming - ํผ๋ณด๋์น ์์ด
โ๏ธ DP๋ฅผ ์ด์ฉํด ํผ๋ณด๋์น ์์ด์ ํด๊ฒฐํ๋ ๊ฒฝ์ฐ, Recursion + Memoization / Iteration + Tabulation ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.
1๏ธโฃ Recursion + Memoization
function fibMemo(n, memo = []) {
// ์ด๋ฏธ ํด๊ฒฐํ ํ์ ๋ฌธ์ ์ธ์ง ์ฐพ์๋ณธ๋ค
if(memo[n] !== undefined) {
return memo[n];
}
// n๋ฒ์งธ ํผ๋ณด๋์น ๊ฐ์ด ์๋ค๋ฉด ๋ ๊ตฌํ์ง ์๊ณ ์ ์ฅ๋ ๊ฐ์ ์ฌ์ฉํ๋ค.
if(n <= 2) {
return 1;
}
// ์๋ค๋ฉด ์ฌ๊ท๋ก ๊ฒฐ๊ด๊ฐ์ ๋์ถํ์ฌ res์ ํ ๋น(์ฒ์ ๊ณ์ฐํ๋ ์๋ผ๋ฉด)
let res = fibMemo(n-1, memo) + fibMemo(n-2, memo);
// ์ถํ ๋์ผํ ๋ฌธ์ ๋ฅผ ๋ง๋ฌ์ ๋ ์ฌ์ฉํ๊ธฐ ์ํด ๋ฆฌํด ์ ์ memo์ ์ ์ฅ
memo[n] = res;
return res;
}
โฐ ์๊ฐ๋ณต์ก๋๋ O(n) => ๋ฉ๋ชจ์ ์ด์ ์ด ์๋ ๊ทธ๋ฅ ์ฌ๊ทํจ์์ ์๊ฐ๋ณต์ก๋ O(2^n)๊ณผ ๋น๊ตํด ์์ฃผ ๋น ๋ฅด๋ค.
2๏ธโฃ Iteration + Tabulation
โฐ ๋ฐ๋ณต๋ฌธ์ ์ด์ฉํด์ ๊ตฌํํ๋ ๊ฒฝ์ฐ => ์์ ๋ฌธ์ ์์๋ถํฐ ์์ํด์ ํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด ๋๊ฐ๋ Bottom-up ๋ฐฉ์์ ์ฌ์ฉ
function fibTab(n) {
if(n <= 2) {
return 1;
}
// n ์ด 1 & 2์ผ ๋์ ๊ฐ์ ๋ฏธ๋ฆฌ ๋ฐฐ์ด์ ์ ์ฅํด ๋๋๋ค
let fibNum = [0, 1, 1];
for(let i = 3; i <= n; i++) {
fibNum[i] = fibNum[i-1] + fibNum[i-2];
// n >= 3๋ถํฐ๋ ์์ ๋ฐฐ์ด์ ์ ์ฅํด ๋์ ๊ฐ๋ค์ ์ด์ฉํ์ฌ
// n๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ ๋ค ๋ฐฐ์ด์ ์ ์ฅ ํ ๋ฆฌํดํ๋ค
}
return fibNum[n];
}
โ ํฌ๋กฌ ๊ฐ๋ฐ์ ๋๊ตฌ์์ ํจ์ ์คํ ์๊ฐ ์ธก์ ๋ฐฉ๋ฒ
var t0 = performance.now();
fib(50); // ์ฌ๊ธฐ์์ ํจ์ ์คํ์ ์์ผ์ฃผ์ธ์
var t1 = performance.now();
console.log("runtime: " + (t1 - t0) + 'ms')
๐ฐ. Dynamic Programming - ํ์ผ๋ง
Q. 2xn ํฌ๊ธฐ์ ํ์ผ์ด ์ฃผ์ด์ง๋ค๋ฉด, 2x1๊ณผ 1x2 ํฌ๊ธฐ์ ํ์ผ๋ก ์ฑ์ธ ์ ์๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ชจ๋ ๊ตฌํด์ผ ํฉ๋๋ค.
A. ๋งจ ๋ง์ง๋ง ํ์ผ์ ์ธ๋ก ํ์ผ 1๊ฐ์ด๊ฑฐ๋ ๊ฐ๋ก ํ์ผ 2๊ฐ์ธ 2๊ฐ์ง ๊ฒฝ์ฐ๋ฐ์ ์๊ธฐ ๋๋ฌธ์, ๋ง์ง๋ง ํ์ผ์ ์ ์ธํ์ ๋ ๋จ๋ ๊ณต๊ฐ์ ๋ง์ง๋ง ํ์ผ๋ 2๊ฐ์ง ๊ฒฝ์ฐ ๋ฐ์ ์๋ค => ์ธ๋ก์ ๊ฐ๋ก์ ๋ง์ง๋ง ํ์ผ์ ์ ์ธํ ๋๋จธ์ง ๊ณต๊ฐ์ ์ฑ์ฐ๋ ๊ฒฝ์ฐ์ ์์ ๋ต์ด ๊ฐ๋ค.
function tiling2x1(n) {
let memo = [0, 1, 2];
for (let i = 3; i <= n; i++) {
memo[i] = memo[i - 1] + memo[i - 2];
}
return memo[n];
};
'CodeStates > learning contents' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Section 4. [๊ธฐ์ ๋ฉด์ ] (0) | 2023.04.10 |
---|---|
S4) Unit 11. [์๋ฃ๊ตฌ์กฐ/์๊ณ ๋ฆฌ์ฆ] Algorithm with Math & ์ ๊ทํํ์ (0) | 2023.04.06 |
S4) Unit 11. [์๋ฃ๊ตฌ์กฐ/์๊ณ ๋ฆฌ์ฆ] ์๊ณ ๋ฆฌ์ฆ & ์๊ฐ ๋ณต์ก๋ & ๊ณต๊ฐ ๋ณต์ก๋ (0) | 2023.04.05 |
S4) Unit 10. [Deploy]Github Action & Proxy (0) | 2023.04.04 |
S4) Unit 10. [Deploy]๊ฐ๋ฐ ํ๋ก์ธ์ค (0) | 2023.04.03 |