๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜/๋ฐฑ์ค€

๋ฐฑ์ค€ - [BOJ 12015] ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด 2

by ๐Ÿณ Laboon 2024. 2. 1.

๋ฐฑ์ค€ ์˜จ๋ผ์ธ ์ ธ์ง€(BOJ)์—์„œ ์ œ๊ณต ๋˜๋Š” 12015๋ฒˆ ๋ฌธ์ œ๋Š” ์„ ํ–‰ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.

๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด

๋‚˜๋Š” ์œ„ ๋ฌธ์ œ๋ฅผ ๋จผ์ € ํ’€์–ด๋ณด๊ณ  ์˜ค๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค.

ํ•ด๋‹น ๋ฌธ์ œ๋Š” ์ตœ์žฅ ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด(LIS, Longest Increasing Subsequence)๋กœ ์œ ๋ช…ํ•œ ๋ฌธ์ œ์ด๋‹ค.


๋ฌธ์ œ

์ˆ˜์—ด A๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ˆ˜์—ด A = {10, 20, 10, 30, 20, 50} ์ธ ๊ฒฝ์šฐ์— ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์€ A = {1020, 10, 30, 20, 50} ์ด๊ณ , ๊ธธ์ด๋Š” 4์ด๋‹ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์ˆ˜์—ด A์˜ ํฌ๊ธฐ N (1 ≤ N ≤ 1,000,000)์ด ์ฃผ์–ด์ง„๋‹ค.

๋‘˜์งธ ์ค„์—๋Š” ์ˆ˜์—ด A๋ฅผ ์ด๋ฃจ๊ณ  ์žˆ๋Š” Ai๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ Ai ≤ 1,000,000)

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์ˆ˜์—ด A์˜ ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.


ํ’€์ด

์œ„์™€ ๊ฐ™์€ ์ •๋ณด๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผํ•œ๋‹ค.

 

์šฐ๋ฆฌ๋Š”, ๋ฌธ์ œ์˜ ์˜ˆ์‹œ ๋•Œ๋ฌธ์— {10, 20, 10, 30, 20, 50}์ด๋ผ๋Š” ์ˆ˜์—ด์˜ ์ตœ์žฅ ๊ธธ์ด๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

ํ•ด๋‹น ๋ฌธ์ œ๋Š” 1 <= N <= 100๋งŒ์ด๋ฏ€๋กœ O(1) ~ O(NlogN)์— ํ•ด๊ฒฐํ•ด์•ผํ•˜๋Š” ๋ฌธ์ œ์ž„์„ ์˜ˆ์ธกํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Naive ํ•˜๊ฒŒ ์ ‘๊ทผํ•˜๊ธฐ

 

1. ์ง๊ด€์ ์œผ๋กœ ๋ณด๊ธฐ

1. 10, 20์ด ๋งŒ๋“ค์–ด์ง

2. 10์€ ๋ถ™์—ฌ๋ดค์ž ์งง์œผ๋‹ˆ๊นŒ ๋ถ™์ด์ง€ ์•Š์Œ.

3. 10, 20, 30์ด ๋งŒ๋“ค์–ด์ง

4. 20์€ ๋ถ™์—ฌ๋ดค์ž ์งง์œผ๋‹ˆ๊นŒ ๋ถ™์ด์ง€ ์•Š์Œ

5. 10, 20, 30, 50์ด ๋งŒ๋“ค์–ด์ง

 

์ •๋ง ๋ณด์ด๋Š”๋Œ€๋กœ๋งŒ ์ ‘๊ทผํ•˜๋ฉด ์œ„์™€๊ฐ™์€ ๊ณผ์ •์ด ๋ฐœ์ƒํ•œ๋‹ค.

 

๊ณผ์—ฐ, ์ •๋‹ต์ผ๊นŒ?

 

์šฐ๋ฆฌ๋Š” ์ฃผ์–ด์ง„ ์ˆ˜์—ด์—์„œ {10, 20, 10, 30, 20, 50} ์ƒ‰์น ๋œ ๊ฐ’ ๋•Œ๋ฌธ์— ์›์†Œ ์‚ฌ์ด์— ์–ด๋–ค ๊ฐ’์ด ์žˆ์„์ง€ ๋ชจ๋ฅธ๋‹ค.

{10, 20, 11, 12, 15, 30, 20, 50} ํ•ด๋‹น ์ˆ˜์—ด์—์„œ ์œ„ ํ’€์ด๊ฐ€ ์„ฑ๋ฆฝ๋˜์ง€ ์•Š์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋Ÿผ, ์–ด๋–ป๊ฒŒ ์ ‘๊ทผํ•ด์•ผํ• ๊นŒ?

 

์ˆœ์„œ๋Œ€๋กœ ์ž…์žฅ์„ ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋œ๋‹ค. ์ด ๋ง์ด ๋ฌด์Šจ ๋œป์ด๋ƒ๋ฉด,

{10, 20, 11, 12, 15, 30, 20, 50} ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆ˜์—ด์—์„œ 

  1. 0๋ฒˆ ์งธ index : 10, ๋งจ ์•ž์ด๋ฏ€๋กœ ์ˆ˜์—ด์˜ ์ตœ์žฅ ๊ธธ์ด๋Š” 1์„ ๊ฐ–๊ฒŒ ๋œ๋‹ค.
  2. 1๋ฒˆ ์งธ index : 20, ๋‚ด ์•ž์— ๋‚˜๋ณด๋‹ค ์ž‘์€ ์›์†Œ๋ฅผ ์ฐพ๋Š”๋‹ค.
    • 0๋ฒˆ ์งธ index์ธ 10, 10์˜ ๊ธธ์ด = 1
    • 1๋ฒˆ ์งธ index์ธ 20์˜ ๊ธธ์ด๋Š” ๋‚˜๋ณด๋‹ค ์ž‘์€ ์›์†Œ์— ์ด์–ด์ง€๋Š” ์ˆ˜์—ด์ด๋ฏ€๋กœ 10์˜ ๊ธธ์ด + 1๋กœ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.
  3. 2๋ฒˆ ์งธ index : 11, ๋‚ด ์•ž์— ๋‚˜๋ณด๋‹ค ์ž‘์€ ์›์†Œ๋ฅผ ์ฐพ๋Š”๋‹ค.
    • 1๋ฒˆ ์งธ index์ธ 20, ๋‚˜๋ณด๋‹ค ํผ
    • 0๋ฒˆ ์งธ index์ธ 10, ๋‚˜๋ณด๋‹ค ์ž‘์Œ
    • 0๋ฒˆ ์งธ index๊นŒ์ง€์˜ ๊ธธ์ด + 1๋กœ ๋‚ด ๊ธธ์ด๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.

ํ•ด๋‹น ๋ฌธ์ œ๋Š” ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.์ด์ „ ๊ฐ’์˜ ๊ธฐ๋ก์„ ์ด์šฉํ•ด ํ˜„์žฌ ๋‚ด ๊ธฐ๋ก์„ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ๋ฉ”๋ชจ์ œ์ด์…˜ ๊ธฐ๋ฒ•์ด ๋“ค์–ด๊ฐ„๋‹ค.

 

์‹œ๊ฐ„ ๋ณต์žก๋„๋Š”?

 

ํ’€์ด๋ฅผ ์ƒ๊ฐํ–ˆ๋‹ค๋ฉด, BOJ์™€ ๊ฐ™์€ ์˜จ๋ผ์ธ ์ ธ์ง€์—์„œ๋Š” ๊ทธ๋ƒฅ ๋ƒ…๋‹ค ์ œ์ถœํ•ด๋ด๋„ ๋ฌด๊ด€ํ•˜๋‹ค.

ํ•˜์ง€๋งŒ, ์ฝ”๋”ฉํ…Œ์ŠคํŠธ๋‚˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋Œ€ํšŒ๋ฅผ ์ƒ๊ฐํ•œ๋‹ค๋ฉด ์ •๋‹ต์ด ์˜ณ์€์ง€ ๊ฒ€์ฆ์„ ํ•ด๋ด์•ผํ•œ๋‹ค.

์šฐ๋ฆฌ๋Š” ์œ„ ํ’€์ด๊ฐ€ ์ •๋‹ต์ด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ์•Œ๊ฒŒ ๋๋‹ค.

 

๊ทธ๋Ÿผ ์‹œ๊ฐ„ ์•ˆ์— ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋Š”์ง€ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ํ•œ ๋ฒˆ ๊ณ„์‚ฐํ•ด๋ด์•ผ ํ•˜๋Š”๋ฐ,

ํ˜„์žฌ ์ธ๋ฑ์Šค์ผ ๋•Œ, ์ด์ „ ์ธ๋ฑ์Šค ์ค‘์—์„œ ๋‚˜๋ณด๋‹ค ์ž‘์€ ๊ฐ’์„ ์ฐพ๋Š” ๋ฌธ์ œ์ด๋‹ค.

๋งŒ์•ฝ์— ์ˆ˜์—ด์ด ๋‚ด๋ฆผ์ฐจ์ˆœ {5, 4, 3, 2, 1}๋กœ ๋˜์–ด ์žˆ๋‹ค๋ฉด?

 

์ •๋‹ต์€ 1์ด์ง€๋งŒ ์ตœ์•…์˜ ๊ฒฝ์šฐ, O(N^2)์„ ์ƒ๊ฐํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

N๊ฐœ์— ๋Œ€ํ•ด์„œ N-1๋ฒˆ๊นŒ์ง€ ํƒ์ƒ‰์„ ํ•ด์•ผํ•˜๋ฏ€๋กœ N * (N-1)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

๋ฌธ์ œ์—์„œ ์šฐ๋ฆฌ๊ฐ€ ์ž…๋ ฅ๋ฐ›๋Š” N์˜ ๋ฐ์ดํ„ฐ๋Š” 100๋งŒ๊ฐœ์ด๋‹ค. 

100๋งŒ * (100๋งŒ - 1), ์ฃผ์–ด์ง„ ์ œํ•œ ์‹œ๊ฐ„์€ 1์ดˆ์ธ๋ฐ ํ„ฐ๋ฌด๋‹ˆ ์—†๋‹ค ใ…‹ใ…‹ใ…‹

 

์ข€ ๋” ํšจ์œจ์ ์ธ ์ ‘๊ทผ์„ ํ•˜๊ธฐ

 

์ข€ ๋”, ํšจ์œจ์ ์ธ ์ ‘๊ทผ์„ ํ•œ๋‹ค๋Š”๊ฒŒ ๋ง๋งŒ ์‰ฝ์ง€. ๊ทธ๊ฒƒ์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฌด์ฒ™ ํž˜๋“ค๋‹ค๋Š” ๊ฒƒ์€ ์•ˆ๋‹ค.

Dynamic Programming ์ ์ธ ์ ‘๊ทผ์ด ์„ฑ๊ณตํ–ˆ๋‹ค๋ฉด ์ข€ ๋” ํšจ์œจ์ ์ธ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

{10, 20, 11, 30} ์ด ์žˆ๋‹ค๊ณ  ํ•  ๋•Œ, ์šฐ๋ฆฌ๋Š” {10, 20, 30}์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์ง€๋งŒ {10, 11, 30}๋„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด ๋‚ด์šฉ์„ ๋ณด๊ณ  {10, 20, 11, 12, 15, 30, 20, 50}  ์ด ์ˆ˜์—ด์„ ๋ณธ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ์ง€ ๋– ์˜ฌ๋ ค์•ผ ํ•œ๋‹ค.

 

ํ˜„์žฌ ์›์†Œ์— ๋Œ€ํ•ด์„œ ์ด์ „ ์›์†Œ๊นŒ์ง€ ๊ฐ™์€ ๊ธธ์ด์˜ ์ˆ˜์—ด ์ง‘ํ•ฉ์ด ์—ฌ๋Ÿฌ๊ฐœ๊ฐ€ ์žˆ๋‹ค๋ฉด?

 

{10, 20, 11, 12, 30} ์„ ๋ณด์ž
๊ธธ์ด๊ฐ€ 1์ผ ๋•Œ, {10}

๊ธธ์ด๊ฐ€ 2์ผ ๋•Œ, {10, 20}, {10, 11}

๊ธธ์ด๊ฐ€ 3์ผ ๋•Œ, {10, 20, 30}, {10, 11, 12}, {10, 11, 30}, {11, 12, 30}

...

์ด๋Ÿฐ ์‹์œผ๋กœ ๋‚˜์—ด๋œ๋‹ค.

 

์–ด์ฐจํ”ผ ๊ฐ™์€ ๊ธธ์ด๋ผ๋ฉด ๋” ์ž‘์€์ˆ˜๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ๋‚ซ์ง€ ์•Š์„๊นŒ?

 

์šฐ๋ฆฌ๋Š” ์ด๋Ÿฐ ์ƒ๊ฐ์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ์ ‘๊ทผํ•ด์•ผํ•œ๋‹ค.

๊ทธ๋Ÿผ ๋˜ ๋‹ค๋ฅธ ๋ฐ˜๋ก€๋ฅผ ๋“ค์–ด๋ณด์ž.

{10, 20, 11, 12, 15, 30, 13, 20, 25, 50} ์ผ ๋•Œ, 
์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ ๋Œ€๋กœ๋ฉด 6๋ฒˆ์งธ ์ธ๋ฑ์Šค์˜ ๊ฐ’์ธ '13'์— ๋Œ€ํ•ด์„œ ์ฒ˜๋ฆฌ ํ•  ๋•Œ,
5๋ฒˆ์งธ ์ธ๋ฑ์Šค๊นŒ์ง€ ์ฒ˜๋ฆฌํ•œ ๊ฒฐ๊ณผ๋Š” {10, 11, 12, 15, 30}๋ฅผ ๋งŒ์กฑํ•˜๊ฒŒ ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

์ด์ œ '13'๋ณด๋‹ค ์ž‘์€ ๋…€์„์„ ์ฐพ์•„์„œ ๋’ค์— ๋ถ™์—ฌ์ฃผ๋ฉด ๋œ๋‹ค.

๊ทธ๋Ÿผ {10, 11, 12, 13}์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. 

์ด๊ฒƒ์˜ ๊ธธ์ด๋Š” 4์ด๊ณ  5๋ฒˆ์งธ ์ธ๋ฑ์Šค๊นŒ์ง€ ์ฒ˜๋ฆฌํ•œ ๊ฒฐ๊ณผ์—์„œ ๊ธธ์ด๊ฐ€ 4์ธ ์ˆ˜์—ด์€ {10, 11, 12, 15}์ด๋‹ค.

 

{10, 11, 12, 13}์ด ๋” ์ž‘์€ ๊ฐ’์ด๋ฏ€๋กœ ์„ ํƒํ•˜๊ฒŒ๋œ๋‹ค๋ฉด ๊ฒฐ๊ณผ๋Š” {10, 11, 12, 13, 30}์ด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

์–ด ? ๊ทผ๋ฐ 13์€ 30๋ณด๋‹ค ๋’ค์— ์žˆ๋Š”๋ฐ? 

์ด๋Ÿฐ ์ƒ๊ฐ์ด ๋“ ๋‹ค๋ฉด ์ •์ƒ์ด๋‹ค.

์šฐ๋ฆฌ๋Š” ์ตœ์žฅ ๊ธธ์ด๋ฅผ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ง€๊ธˆ 4๋ฒˆ์งธ์— 13์ธ์ง€ 15์ธ์ง€ ์•Œ ํ•„์š”๊ฐ€ ์—†๋‹ค.

๊ทธ๋ƒฅ 30๋ณด๋‹ค ์ž‘์€์ˆ˜๋กœ ์ด๋ฃจ์–ด์ง„ LIS์˜ ๊ธธ์ด๊ฐ€ 4๋ผ๋Š” ๊ฒƒ์€ ์•Œ๊ณ  ์žˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๊ธธ์ด๋งŒ ์•Œ๋ฉด ๋˜๋‹ˆ๊นŒ 30 ์•ž์— 13์ด ์žˆ๋˜, 15๊ฐ€ ์žˆ๋˜ 30๋ณด๋‹ค ์ž‘์€ ์ˆ˜๋‹ˆ๊นŒ ๋งŒ์กฑํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

์ด๊ฒŒ ๋˜ ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ์œผ๋‹ˆ {10, 20, 11, 12, 15, 30, 13, 20, 25, 50} ์ด ์ˆ˜์—ด์— ๋Œ€ํ•ด ์ด๋ฒˆ์—๋Š” 20์„ ์„ ํƒํ•ด๋ณด์ž.

7๋ฒˆ ์งธ ์ธ๋ฑ์Šค์˜ ๊ฐ’์ธ '20'์— ๋Œ€ํ•ด์„œ 6๋ฒˆ์งธ ์ธ๋ฑ์Šค ๊ฐ’์ธ 30๊นŒ์ง€์˜ ๊ฒฐ๊ณผ๋ฅผ ์•Œ์•„์•ผ ํ•œ๋‹ค.

์šฐ๋ฆฌ๋Š” ์œ„์˜ ๊ณผ์ •์—์„œ {10, 11, 12, 13, 30}๋ผ๋Š” ๊ฒฐ๊ณผ๋ฅผ ์–ป์—ˆ๊ณ  ์ด์ œ 20์„ ๋„ฃ์–ด๋ณด์ž.

 

'20'๋ณด๋‹ค ์ž‘์€ ์ˆ˜๋กœ ๊ตฌ์„ฑ๋œ ์ˆ˜์—ด์€ {10, 11, 12, 13}์ด๊ณ  ์ด์–ด ๋ถ™์ด๊ฒŒ ๋œ๋‹ค๋ฉด {10, 11, 12, 13, 20}์ด ๋œ๋‹ค.

์ด๊ฒƒ์˜ ๊ธธ์ด๋Š” 5์ด๊ณ  ์ด์ „ ๊ฒฐ๊ณผ์—์„œ ๊ธธ์ด๊ฐ€ 5์ธ ์ˆ˜์—ด์€ {10, 11, 12, 13, 30} ์ด๋‹ค.

 

์šฐ๋ฆฌ๋Š” ๋” ์ž‘์€ ๊ฐ’์„ ์„ ํƒํ•˜๊ธฐ๋กœ ํ–ˆ์œผ๋‹ˆ 7๋ฒˆ์งธ ์ธ๋ฑ์Šค๊นŒ์ง€ LIS ๊ธธ์ด๋Š” 5์ด๋‹ค.

 

์ด์ œ '25'๋ฅผ ์„ ํƒํ•ด๋ณด์ž.
{10, 11, 12, 13, 20} ์—์„œ '25'๋ณด๋‹ค ์ž‘์€ ์ˆ˜๋กœ ์ด๋ฃจ์–ด์ง„ ์ˆ˜์—ด์„ ์ฐพ๋Š”๋‹ค๊ณ ํ•˜๋ฉด ๊ทธ ์ž์ฒด์ด๋‹ค.

๋’ค์— 25๋งŒ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋  ๋ฟ์ด๊ฒŒ ๋จ. -> {10, 11, 12, 13, 20, 25}

 

๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ, ์ด์ „ ๊ณผ์ •์—์„œ {10, 11, 12, 13, 20}๊ณผ {10, 11, 12, 13, 30}์˜ ๊ธธ์ด๊ฐ€ ๊ฐ™๋‹ค๋Š” ์ด์œ ๋กœ 
{10, 11, 12, 13, 30}์„ ์„ ํƒํ–ˆ๋‹ค๋ฉด? 

์šฐ๋ฆฌ์˜ ๋…ผ๋ฆฌ๋Œ€๋กœ๋ผ๋ฉด {10, 11, 12, 13, 25}๋ผ๋Š” ๊ฒฐ๊ณผ๋ฅผ ์–ป๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

 

์šฐ๋ฆฌ๋Š” ์œ„ ๊ณผ์ •์—์„œ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋‹ค ๊ตฌํ•ด๋ดค๋‹ค.

๊ทธ๋Ÿผ, ์ด์ œ ์ง์ ‘ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ด์•ผ ํ•˜๋Š”๋ฐ ์–ด๋–ป๊ฒŒ ํ’€ ์ˆ˜ ์žˆ์„๊นŒ?

lower_bound

 

์šฐ๋ฆฌ๋Š” lower_bound๋ผ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ด์„œ ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

์ƒ๊ฐ์˜ ์ „ํ™˜์„ ๊ฐ€์ ธ๋ณด์ž.

 

์ž‘์€ ์ˆ˜๊นŒ์ง€ ์„ ํƒํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์ž‘์€์ˆ˜๊ฐ€ ์•„๋‹Œ ์ˆ˜๋ฅผ ์„ ํƒํ•˜๋ฉด? ๊ทธ ์ด์ „๊นŒ์ง€๋Š” ๋ฌด์กฐ๊ฑด ์ž‘์€ ์ˆ˜์ด๋‹ค.

๋…ผ๋ฆฌ์‹์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด key < x๊ฐ€ ์ž‘์€ ์ˆ˜๊นŒ์ง€ ์„ ํƒ, ์ด ๋ฐ˜๋Œ€๋Š” key >= x

 

์ฆ‰, ํ˜„์žฌ ์›์†Œ ๊ฐ’ ์ด์ƒ์˜ ๊ฐ’์„ ์ฐพ์œผ๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

log N์— ๋น ๋ฅด๊ฒŒ ์ฐพ์•„์ฃผ๋Š” lower_bound๋ฅผ ์‚ฌ์šฉ!

 

lower_bound๋งŒ ์ด์šฉ
๋”๋ณด๊ธฐ
/*
	authored by jihwankim
	https://dev-dot.tistory.com
	acm 12015
*/

#include <bits/stdc++.h>

using namespace std;
 

vector<int> input(int &n) {
	cin >> n;
	vector<int> arr(n);
	for(int i = 0; i < n; i++) {
		cin >> arr[i];	
	}
	
	return arr;
}

int solve(vector<int> &arr) {
	vector<int> lis;
	
	for(int i = 0; i < arr.size(); i++) {
		int key = arr[i];
		int v = lower_bound(lis.begin(), lis.end(), key) - lis.begin();
		 
		if(v == lis.size()) {
			lis.push_back(key);
		} else {		
			lis[v] = key;	
		}
		
	}

	return lis.size();
}

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(NULL);
	
	int n;
	vector<int> arr = input(n);
	cout << solve(arr);
	
	return 0;
}

 

STL set์„ ์ด์šฉ

 

๋‚œ ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ๋Š” set์„ ์‚ฌ์šฉํ•ด์„œ ํ’€๊ธดํ–ˆ๋‹ค.

์›๋ฆฌ๋Š” ๊ฐ™์œผ๋‚˜ ์–ด๋–ค ์ฐจ์ด์ ๋“ค์ด ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์„๋“ฏ!

๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ๋” ์ข‹์€์ง€๋„ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ข‹์„๋“ฏ!

๋”๋ณด๊ธฐ
/*
	authored by jihwankim
	https://dev-dot.tistory.com
	acm 12015
*/

#include <bits/stdc++.h>

using namespace std;
 

vector<int> input(int &n) {
	cin >> n;
	vector<int> arr(n);
	
	for(int i = 0; i < n; i++) {
		cin >> arr[i];	
	}
	
	return arr;
}

int solve(vector<int> &arr) {
	set<int> s;
	
	for (int &now: arr) {
		auto it = s.lower_bound(now);
		if (it != s.end()) s.erase(it); 
		s.insert(now);
	}
	
	return s.size();
}

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(NULL);
	
	int n;
	vector<int> arr = input(n);
	cout << solve(arr);
	
	return 0;
}

 

์ฐธ๊ณ ํ•  ํฌ์ŠคํŠธ

 

์•„์ง ๋ฏธ์ž‘์„ฑ

 

๋ฌธ์ œ

 

https://www.acmicpc.net/problem/12015

 

12015๋ฒˆ: ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด 2

์ฒซ์งธ ์ค„์— ์ˆ˜์—ด A์˜ ํฌ๊ธฐ N (1 ≤ N ≤ 1,000,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” ์ˆ˜์—ด A๋ฅผ ์ด๋ฃจ๊ณ  ์žˆ๋Š” Ai๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ Ai ≤ 1,000,000)

www.acmicpc.net