๊ธ€ ์ž‘์„ฑ์ž: ๊ฐœ๋ฐœํ•˜๋Š” ํ›ˆ์ด

Greedy Algorithm

ํƒ์š• ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋„ ํ•˜๋Š” ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ฌธ์ œ๋ฅผ ๋‹จ๊ณ„์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๋ฉด์„œ, ํ•œ ๋‹จ๊ณ„๋งˆ๋‹ค ๊ทธ ์ˆœ๊ฐ„์˜ ์ตœ์„ ์˜ solution ์ด๋ผ๊ณ  ์ƒ๊ฐ๋˜๋Š” solution์„ ์„ ํƒํ•ด์„œ ์ตœ์ข…์ ์ธ solution์„ ์ฐพ์•„๊ฐ€๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ „๋žต์ด๋‹ค.

Local Optimum and Global Optimum Solution

์ด๋•Œ ์–ด๋–ค ๋‹จ๊ณ„์—์„œ ๋ณด์ด๋Š” ์ตœ์„ ์˜ solution์„ local optimum ์ด๋ผ๊ณ  ํ•˜๊ณ , ์ „์ฒด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ตœ์ ์˜ solution์„ global optimum ์ด๋ผ๊ณ  ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๋ชจ๋“  ๋ฌธ์ œ๊ฐ€ local optimum์„ ํ†ตํ•ด global optimum์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋Š” ์•Š๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ธ์ƒ์„ ์‚ด๋ฉด์„œ ํ˜„์žฌ ์ˆœ๊ฐ„์— ์ตœ์„ ์˜ ์„ ํƒ์„ ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๋‚˜์ค‘์— ์ง€๋‚˜๊ณ ๋ณด๋ฉด ๊ทธ๊ฒŒ ์ตœ์„ ์ด ์•„๋‹ ๋•Œ๊ฐ€ ๋งŽ์ง€ ์•Š์€๊ฐ€..

Coin Change Problem

๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๊ฐ€ Coin Exchange Problem ์ด๋‹ค. ์–ด๋–ค ๊ฐ€๊ฒŒ์—์„œ ๊ฑฐ์Šค๋ฆ„ ๋ˆ์„ ๊ฑด๋„ค์ค€๋‹ค๊ณ  ํ•  ๋•Œ, ๊ทธ ๊ฐ€๊ฒŒ๋Š” ์ตœ์†Œํ•œ์˜ ๋™์ „ ๊ฐฏ์ˆ˜๋กœ ๊ฑฐ์Šค๋ฆ„ ๋ˆ์„ ์ฃผ๊ธฐ๋ฅผ ์›ํ•  ๊ฒƒ์ด๋‹ค.

 

๊ทธ๋Ÿผ ์ตœ์†Œํ•œ์˜ ๋™์ „๋งŒ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๊ฑฐ์Šค๋ฆ„๋ˆ์„ ์ค„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ๋ฌด์—‡์ด ์žˆ์„๊นŒ? ๋‹ค์Œ ์˜ˆ์‹œ๋ฅผ ๋ณด์ž.

  • ๋ฌธ์ œ: ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋™์ „์€ 0.5, 0.25, 0.1, 0.05, 0.01 ๋ผ๊ณ  ํ•˜์ž. ๊ฑฐ์Šฌ๋Ÿฌ์ค˜์•ผ ํ•  ๋ˆ์ด 0.74์ผ ๋•Œ ๋™์ „ ๊ฐฏ์ˆ˜๋ฅผ ์ตœ์†Œํ•œ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์ค„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€?
  • ํ•ด๊ฒฐ๋ฐฉ๋ฒ•: ๋„ˆ๋ฌด๋‚˜ ์ƒ์‹์ ์œผ๋กœ ์ƒ๊ฐํ•ด๋ณด๋ฉด ๊ทธ๋ƒฅ ๊ฐ€์žฅ ๊ฐ’์ด ํฐ ๋™์ „์„ ์šฐ์„ ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ๋”ฐ๋ผ์„œ 0.5 ํ•œ ๊ฐœ, 0.1 ๋‘ ๊ฐœ, 0.01 ๋„ค ๊ฐœ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ตœ์†Œํ•œ์˜ ๊ฐฏ์ˆ˜๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

์œ„ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์šฉํ•œ ์˜ˆ์ด๋‹ค. 0.5 ์งœ๋ฆฌ ๋™์ „์„ ์„ ํƒํ–ˆ์„ ๋•Œ ์ตœ์„ ์˜ ๊ฒฝ์šฐ๋Š” 0.5 ์งœ๋ฆฌ ํ•˜๋‚˜๋ฅผ ๋‚ด๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚จ์€ ๋ˆ์„ ๊ฑฐ์Šฌ๋Ÿฌ์ค„ ๋•Œ 0.25 ์—์„œ ์ค„ ์ˆ˜ ์žˆ๋Š” ์ตœ์„ ์˜ ๊ฒฝ์šฐ๋Š” 0, 0.1์—์„œ๋Š” 2 ... ์ด๋Ÿฐ์‹์œผ๋กœ ๋‹จ๊ณ„๋งˆ๋‹ค ์ตœ์„ ์˜ ๊ฒฝ์šฐ๋ฅผ ์„ ํƒํ•˜๋‹ค๋ณด๋ฉด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ฒŒ ๋œ๋‹ค.

Activity Selection Problem

๋™์ „ ๊ตํ™˜ ๋ฌธ์ œ๋Š” ๋„ˆ๋ฌด ์‰ฌ์› ์œผ๋‹ˆ๊นŒ, ์ข€ ๋” ๋ณต์žกํ•œ ๋ฌธ์ œ๋ฅผ ์‚ดํŽด๋ณด์ž. Activity Selection Problem ์€ ์–ด๋–ค ์—ฌ๋Ÿฌ ํ™œ๋™๋“ค์˜ ์‹œ์ž‘ ์‹œ๊ฐ„๊ณผ ๋๋‚˜๋Š” ์‹œ๊ฐ„์ด ์ฃผ์–ด์ ธ ์žˆ์„ ๋•Œ, ์ฃผ์–ด์ง„ ์–ด๋–ค ์‹œ๊ฐ„ ์•ˆ์— ํ•  ์ˆ˜ ์žˆ๋Š” ํ™œ๋™์„ ์ตœ๋Œ€ํ•œ ๋งŽ์ด ๋ฐฐ์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š” ๋ฌธ์ œ์ด๋‹ค.

Theorem

๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ํ–ˆ๋˜ ๊ฒƒ ์ฒ˜๋Ÿผ, ์ด ๋ฌธ์ œ๊ฐ€ optimal substructure๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ๋จผ์ € ํ™•์ธํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์ณ์•ผํ•œ๋‹ค.

  • ์šฐ๋ฆฌ์—๊ฒŒ ํ™œ๋™๋“ค์˜ ์ง‘ํ•ฉ์ธ Sij ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜๊ณ , ํ•ด๋‹น ์ง‘ํ•ฉ์€ ๊ณต์ง‘ํ•ฉ์ด ์•„๋‹ˆ๋ผ๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. Sij ์˜ i๋Š” S ์ „์ฒด์— ๋Œ€ํ•œ ์‹œ์ž‘์‹œ๊ฐ„, j๋Š” S ์ „์ฒด์— ๋Œ€ํ•œ ๋๋‚˜๋Š” ์‹œ๊ฐ„์„ ์˜๋ฏธํ•œ๋‹ค๊ณ  ํ•˜์ž.
  • am ์„ ์„ค์ •ํ•˜๊ณ  ์ด ๋ณ€์ˆ˜๊ฐ€ Sij ์•ˆ์— ์žˆ๋Š” ํ™œ๋™๋“ค์„ ์ตœ๋Œ€ํ•œ ๋งŽ์ด ๋ฐฐ์น˜ํ•œ ๊ฐฏ์ˆ˜ ๋ผ๊ณ  ํ•œ๋‹ค๋ฉด,
  • Sim, ์ฆ‰ ์ตœ๋Œ€ํ•œ ๋งŽ์ด ๋ฐฐ์น˜ํ–ˆ์„ ๋•Œ์˜ ์‹œ์ž‘์‹œ๊ฐ„๊ณผ S์˜ ์‹œ์ž‘ ์‹œ๊ฐ„ ์‚ฌ์ด์—๋Š” ์–ด๋–ค ํ™œ๋™๋„ ์กด์žฌํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค. ์™œ๋ƒํ•˜๋ฉด, ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ am ์„ ์ตœ๋Œ€ ๊ฐฏ์ˆ˜๋กœ ์„ค์ •ํ–ˆ๊ธฐ ๋–„๋ฌธ์ด๋‹ค.
  • ๋”ฐ๋ผ์„œ, ์–ด๋–ค ์ˆœ๊ฐ„์˜ ์ตœ์ ์˜ ๋ฐฐ์น˜์ธ am ์„ ์ฐพ๋Š” ๋‹ค๋ฉด ์ „์ฒด ๋ฌธ์ œ์˜€๋˜ Sij ๋Š” am์ด ๋๋‚˜๋Š” ์‹œ๊ฐ„๋ถ€ํ„ฐ S๊ฐ€ ๋๋‚˜๋Š” ์‹œ๊ฐ„ ์‚ฌ์ด์— ์žˆ๋Š” ์ตœ๋Œ€ ๋ฐฐ์น˜๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ๋กœ ๋ฌธ์ œ๊ฐ€ ์ž‘์•„์ง€๊ฒŒ ๋œ๋‹ค. ์ฆ‰ ์ด ๋ฌธ์ œ๋Š” optimal substructure ๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค๋Š” ๋œป์ด๋‹ค.

Solution

๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ค ๊ตฌ๊ฐ„์—์„œ ์ตœ๋Œ€ํ•œ์œผ๋กœ ํ™œ๋™์„ ๋งŽ์ด ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋ณด์ž. ๋™์ „ ๊ตํ™˜๋ฌธ์ œ์™€ ๋น„์Šทํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ๊ฐ€์žฅ ๋ substructure๊นŒ์ง€ ์ชผ๊ฐœ์–ด๋ณด๋ฉด ๊ฒฐ๊ตญ ์ œ์ผ ๋งˆ์ง€๋ง‰์—๋Š” ์ด์ „ ํ™œ๋™๊ณผ ์ด์–ด๋ถ™์ผ ์ˆ˜ ์žˆ๋Š” ํ™œ๋™ ์ค‘์—์„œ ๋๋‚˜๋Š” ์‹œ๊ฐ„์ด ๊ฐ€์žฅ ์งง์€ ํ™œ๋™์ด ๋  ๊ฒƒ์ด๋‹ค. ๋๋‚˜๋Š” ์‹œ๊ฐ„์ด ๊ฐ€์žฅ ๋น ๋ฅธ ํ™œ๋™์„ ์•ž์—, ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋๋‚˜๋Š” ์‹œ๊ฐ„ ์ดํ›„์— ๊ฐ€์žฅ ๋นจ๋ฆฌ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ํ™œ๋™ ์ค‘ ๋๋‚˜๋Š” ์‹œ๊ฐ„์ด ๊ฐ€์žฅ ๋น ๋ฅธ ํ™œ๋™์„ ๊ณจ๋ผ ๋ฐ”๋กœ ์‹œ์ž‘ํ•˜๋ฉด ์ตœ๋Œ€ํ•œ ๋งŽ์€ ํ™œ๋™๋“ค์„ ๋‚˜์—ด ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ํ•œ ํ™œ๋™์ด ๋๋‚ฌ์„ ๋•Œ ๊ณ ๋ฅผ ์ˆ˜ ์žˆ๋Š” ์ตœ์„ ์˜ ํ™œ๋™(local optimum)์„ ๊ณ ๋ฅด๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

์ด๋ฅผ ์œ„ํ•ด์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์œ„ํ•ด์„œ key๊ฐ€ ๋˜๋Š” ๊ฐ’, Activity Selection Problem ๊ฐ™์€ ๋ฌธ์ œ์—์„œ๋Š” ๋๋‚˜๋Š” ์‹œ๊ฐ„์„ ๊ธฐ์ค€์œผ๋กœ ์ „์ฒด๋ฅผ ์†ŒํŒ…ํ•œ ํ›„์— ํ™œ๋™๋“ค์„ ์ฐพ์•„๊ฐ„๋‹ค.

Example Problem

[๋ฐฑ์ค€ ์•Œ๊ณ ๋ฆฌ์ฆ˜] ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ 1931๋ฒˆ์— ํšŒ์˜์‹ค์„ ๋ฐฐ์ •ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ๋‹ค๋ฅธ ํฌ์ŠคํŠธ์—์„œ ์ •๋ฆฌํ–ˆ๋˜ ๋ถ€๋ถ„์ด๋‹ˆ ๊ทธ๋Œ€๋กœ ์ด๊ณณ์— ๋ง๋ถ™์ด๋„๋ก ํ•˜๊ฒ ๋‹ค.

๋ฌธ์ œ

๋ฌธ์ œ

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

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ํšŒ์˜์˜ ์ˆ˜ N(1 ≤ N ≤ 100,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N+1 ์ค„๊นŒ์ง€ ๊ฐ ํšŒ์˜์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง€๋Š”๋ฐ ์ด๊ฒƒ์€ ๊ณต๋ฐฑ์„ ์‚ฌ์ด์— ๋‘๊ณ  ํšŒ์˜์˜ ์‹œ์ž‘์‹œ๊ฐ„๊ณผ ๋๋‚˜๋Š” ์‹œ๊ฐ„์ด ์ฃผ์–ด์ง„๋‹ค. ์‹œ์ž‘ ์‹œ๊ฐ„๊ณผ ๋๋‚˜๋Š” ์‹œ๊ฐ„์€ 231-1๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜ ๋˜๋Š” 0์ด๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์ตœ๋Œ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํšŒ์˜์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

ํ’€์ด

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

๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ฃผ์–ด์ง„ ๋ฐฐ์—ด์„ ๋ฏธ๋ฆฌ ์ •๋ ฌํ•ด๋‘๊ณ  ์ˆœํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”๋ฐ, ์ด๋ฒˆ ๋ฌธ์ œ์—์„œ ์ƒ๊ฐํ–ˆ์–ด์•ผํ•˜๋Š” ๋ถ€๋ถ„์€ ๋ฐฐ์—ด์„ ์ •๋ ฌํ•  ๋•Œ, ๋๋‚˜๋Š” ์‹œ๊ฐ„์ด ์—ฌ๋Ÿฌ๊ฐœ๊ฐ€ ๊ฒน์น  ๊ฒฝ์šฐ ์ตœ์ ์˜ ๊ฐ’์„ ์–ป์ง€ ๋ชปํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

index 0 1 2 3 4 5
start time 1 2 5 4 7 8
finish time 1 4 7 7 7 8

๋๋‚˜๋Š” ์‹œ๊ฐ„์„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ์„ ํ–ˆ์„ ๋•Œ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •๋ ฌ๋˜์—ˆ๋‹ค๊ณ  ํ•˜์ž, ์ด ๊ตฌ์„ฑ์—์„œ ํšŒ์˜์‹ค์„ ๋ฐฐ์ •ํ•ด๋ณด๋ฉด,

0๋ฒˆ์งธ ๊ตฌ์„ฑ์ด ๋๋‚˜์ž๋งˆ์ž ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ์ œ์ผ ๋๋‚˜๋Š” ์‹œ๊ฐ„์ด ๋น ๋ฅธ 1๋ฒˆ ๊ตฌ์„ฑ์„ ์„ ํƒ,
1๋ฒˆ ๊ตฌ์„ฑ์ด ๋๋‚˜์ž๋งˆ์ž ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ์ œ์ผ ๋๋‚˜๋Š” ์‹œ๊ฐ„์ด ๋น ๋ฅธ ๊ตฌ์„ฑ์ธ 2๋ฒˆ์„ ์„ ํƒ,
3๋ฒˆ์€ ๋๋‚˜๋Š” ์‹œ๊ฐ„๊ณผ ์‹œ์ž‘ํ•˜๋Š” ์‹œ๊ฐ„์ด ์•ˆ๋งž๊ธฐ ๋•Œ๋ฌธ์— ๊ฑด๋„ˆ๋›ฐ๊ณ  4๋ฒˆ์„ ์„ ํƒ,
๋งˆ์ง€๋ง‰์œผ๋กœ 5๋ฒˆ์„ ์„ ํƒํ•˜๊ฒŒ ๋œ๋‹ค.

 

๋”ฐ๋ผ์„œ ๋ฐฐ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ํšŒ์˜์‹ค์˜ ์ตœ๋Œ€ ๊ฐฏ์ˆ˜๊ฐ€ ์ด 5๊ฐœ๊ฐ€ ๋˜๋Š”๋ฐ, ์‚ฌ์‹ค์€ ๊ทธ๋ ‡์ง€ ์•Š๋‹ค. 2๋ฒˆ ์ธ๋ฑ์Šค์™€ 3๋ฒˆ์ธ๋ฑ์Šค๋ฅผ ๊ต์ฒดํ•ด์ฃผ๋ฉด ๋ฐฐ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ํšŒ์˜๊ฐ€ ํ•˜๋‚˜ ๋Š˜์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

index 0 1 2 3 4 5
start time 1 2 4 5 7 8
finish time 1 4 7 7 7 8

์œ„ ๊ตฌ์„ฑ์œผ๋กœ ๋ฐฐ์—ด์ด ์ •๋ ฌ๋œ๋‹ค๋ฉด 6๊ฐœ์˜ ํšŒ์˜์‹ค์„ ๋ฐฐ์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๋๋‚˜๋Š” ์‹œ๊ฐ„์„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•  ๋•Œ, ๊ฐ™์€ ๊ฐ’์ด ๋‚˜์˜ค๋ฉด ์‹œ์ž‘์‹œ๊ฐ„์„ ๋น„๊ตํ•ด์„œ ๋” ๋น ๋ฅธ ์‹œ๊ฐ„์„ ์•ž์— ๋‘์–ด์•ผ ํ•œ๋‹ค.

 

์ด ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ๋Š” pair, vector ๋ฅผ ์ด์šฉํ•ด์„œ ํšŒ์˜์‹œ๊ฐ„์„ ์ง์ง€์–ด์„œ ๋‹ด๊ณ  ์ •๋ ฌ์„ ๊ฑฐ์นœ ๋’ค for๋ฌธ์œผ๋กœ ์ˆœํšŒํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

std::sort๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•˜๋Š” ์†๋„๊ฐ€ n log n ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์•…์˜ ๊ฒฝ์šฐ์—๋„ ๋ฐฐ์—ด ์ „์ฒด๋ฅผ ์ˆœํšŒํ•˜๋Š” ์†๋„๊ฐ€ n ์ด๊ธฐ ๋•Œ๋ฌธ์— O(nlogn)์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฝ”๋“œ

#include <cstdio>
#include <algorithm>
#include <vector>
#include <utility>

using namespace std;

bool pairSecondLess(const pair<int, int> &a, const pair<int, int> &b)
{
    if (a.second == b.second)
    {
        return a.first < b.first; // second ๊ฐ€ ๊ฐ™์œผ๋ฉด first๊ฐ€ ์ž‘์€ ๋†ˆ์ด ๋” ์ž‘๋‹ค!
    }
    return (a.second < b.second);
}

int main()
{
    int N;
    scanf("%d", &N);
    vector<pair<int, int>> greedy;

    for (int i = 0; i < N; i++)
    {
        int s, f;
        scanf("%d %d", &s, &f);
        greedy.push_back(make_pair(s, f));
    }

    sort(greedy.begin(), greedy.end(), pairSecondLess); // ์ •๋ ฌํ•  ๋•Œ ์ธ์ž๋กœ ์œ„์—์„œ ์ •์˜ํ•œ ํ•จ์ˆ˜๋ฅผ ์ค€๋‹ค.

    vector<pair<int, int>> v;
    v.push_back(greedy[0]); // ์ œ์ผ ์ฒ˜์Œ์€ ๋๋‚˜๋Š” ์‹œ๊ฐ„์ด ์ œ์ผ ๋น ๋ฅธ ๊ตฌ์„ฑ์ด ๋“ค์–ด๊ฐ„๋‹ค.
    for (int i = 1; i < greedy.size(); i++)
    {
        if (v.back().second <= greedy[i].first) // ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ์ตœ์ ์˜ ๊ตฌ์„ฑ๊ณผ ๋น„๊ต
        {
            v.push_back(greedy[i]); // ํ˜„์žฌ ์ตœ์„ ์˜ ๋ฐฐ์ •์ด ๊ฐ€์ง„ ๋๋‚˜๋Š” ์‹œ๊ฐ„ ์ดํ›„์— ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„ ์ค‘ ๋๋‚˜๋Š” ์‹œ๊ฐ„์ด ์ œ์ผ ๋น ๋ฅธ ๊ตฌ์„ฑ์„ ๋„ฃ์–ด์ค€๋‹ค.
        }
    }

    printf("%ld", v.size());
}