Jieunny์˜ ๋ธ”๋กœ๊ทธ

S4) Unit 11. [์ž๋ฃŒ๊ตฌ์กฐ/์•Œ๊ณ ๋ฆฌ์ฆ˜] Algorithm ์œ ํ˜• ๋ณธ๋ฌธ

CodeStates/learning contents

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];
};