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

Logest Common Subequence

์šฐ๋ฆฌ ๋ง๋กœ ์ตœ์žฅ ๊ณตํ†ต ๋ถ€๋ถ„ ์ˆ˜์—ด์ด๋ผ๊ณ ๋„ ๋ถˆ๋ฆฌ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ์–ด๋–ค ๋ฌธ์ž์—ด์ด ๋‘ ๊ฐœ ์žˆ์„ ๋•Œ, ๋‘ ์ˆ˜์—ด ์‚ฌ์ด์— ์žˆ๋Š” ๊ณตํ†ต์ ์ธ ๋ฌธ์ž๋“ค์˜ ๊ฐ€์žฅ ๊ธด ์กฐํ•ฉ์„ ์ฐพ๋Š” ๋ฌธ์ œ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ๋‘ ๋ฌธ์ž์—ด์ด ์žˆ๋‹ค๊ณ  ํ•˜์ž.

X = (A, B, C, B, D, A, B)
Y = (B, D, C, A, B, A)

 

๋‘ ๋ฌธ์ž์—ด์˜ ์‚ฌ์ด์—๋Š” ๋งŽ์€ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด๋“ค์ด ์žˆ๋Š”๋ฐ, ๋ฌธ์ž๊ฐ€ ํ•˜๋‚˜ ๋ฟ์ธ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„ ์ œ์™ธํ•˜๊ณ  ๋ชจ๋‘ ๋‚˜์—ดํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

A, B
A, B, A
B, C
B, C, B
C, B
C, B, A
B, D
B, D, A
B, D, A, B

 

์ด ์ค‘์—์„œ ๊ฐ€์žฅ๊ธด ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์€ B,D,A,B๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.

Brute-Force

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋จผ์ € ๋ธŒ๋ฃจํŠธ ํฌ์Šค๋กœ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋”ฐ์ ธ๋ณด๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด๋ณด์ž. ์šฐ๋ฆฌ์—๊ฒŒ ๋‘ ๊ฐœ์˜ ๋ฌธ์ž์—ด X[1...m] ๊ณผ Y[1...n] ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•ด๋ณด์ž. ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋‹ค ์‹œ๋„ํ•ด๋ณด๋ ค๋ฉด, X์— ์žˆ๋Š” ๋ชจ๋“  ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„ ๊ตฌํ•ด์„œ Y์— ๋Œ€์ž…ํ•ด๋ณด๋ฉด ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ธŒ๋ฃจํŠธ ํฌ์Šค๋กœ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์†๋„๋Š”,

  1. m ๊ฐœ์˜ ๋ฌธ์ž๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฌธ์ž์—ด X์—์„œ ๋ชจ๋“  ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„ ๋งŒ๋“ค ๋•Œ ๊ฑธ๋ฆฌ๋Š” ์†๋„ 2m.
  2. ์œ„์—์„œ ๊ตฌํ•œ ๋ถ€๋ถ„์ˆ˜์—ด์„ Y์— ๋Œ€์ž…ํ•ด๋ณผ ๋•Œ ์†Œ์š”๋˜๋Š” ์†๋„ O(n).

๋‘ ์—ฐ์‚ฐ ์‹œ๊ฐ„์˜ ํ•ฉ์ด ๋˜๊ณ  ์ตœ์•…์˜ ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ–ˆ์„ ๋•Œ, O(n2m) ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ m์˜ ๊ฐฏ์ˆ˜์— ๋”ฐ๋ผ ์—„์ฒญ๋‚œ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ธŒ๋ฃจํŠธ ํฌ์Šค๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”๋ฐ ์ ํ•ฉํ•œ ์ ‘๊ทผ์ด ์•„๋‹ˆ๋‹ค.

Dynamic Programming

Step 1 : Optimal Substructure

๋ฌธ์ œ๋ฅผ ์ผ๋ฐ˜ํ™”ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋น„๊ตํ•ด์•ผํ•˜๋Š” ๋ฌธ์ž์—ด์„ X=<x1, x2, ... , xm>, Y=<y1, y2, ... , yn> ๋ผ๊ณ  ํ•˜๊ณ , ๋‘ ๋ฌธ์ž์—ด์˜ LCS๋ฅผ Z=<z1, z2, ... , zk> ๋ผ๊ณ  ํ•ด๋ณด์ž. ๊ทธ๋ ‡๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช…์ œ๊ฐ€ ์„ฑ๋ฆฝํ•œ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

  1. xm = yn ์ด๋ผ๋ฉด, xm = yn = zk ์ด๊ณ  ์ƒˆ๋กœ์šด LCS ๋Š” Xm-1 ์™€ Yn-1 ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ˆ˜์‹์ด ํ—ท๊ฐˆ๋ฆด ์ˆ˜๋„ ์žˆ๋Š”๋ฐ, ๋งค์šฐ ๋‹น์—ฐํ•œ ์ด์•ผ๊ธฐ๋ฅผ ์ˆ˜ํ•™์ ์œผ๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ์ด๋‹ค. ๋‘ ๋ฌธ์ž์—ด์˜ ๊ฐ€์žฅ ๋ ๋ฌธ์ž๊ฐ€ ์„œ๋กœ ๊ฐ™๋‹ค๋ฉด, LCS์˜ ๊ฐ€์žฅ ๋์ด ํ•ด๋‹น ๋ฌธ์ž๋กœ ๋๋‚˜๋Š” ๊ฒƒ์€ ๋„ˆ๋ฌด๋‚˜ ์ž๋ช…ํ•˜์ง€ ์•Š์€๊ฐ€?
  1. xm ≠ yn ์ด๋ผ๋ฉด, xm ≠ zk ์ด๊ณ  ์ƒˆ๋กœ์šด LCS ๋Š” Xm-1 ์™€ Y ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. xm ≠ yn ์ด๋ผ๋ฉด, yn ≠ zk ์ด๊ณ  ์ƒˆ๋กœ์šด LCS ๋Š” X ์™€ Yn-1 ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋งŒ์•ฝ ๋‘ ๋ฌธ์ž๊ฐ€ ๋‹ค๋ฅด๋‹ค๊ณ  ํ•œ๋‹ค๋ฉด, ์šฐ๋ฆฌ๋Š” ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค. X ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋ฅผ ์ค„์ด๊ฑฐ๋‚˜, Y ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์ด๋‹ค.
    ์šฐ๋ฆฌ๊ฐ€ ๊ตฌํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€์žฅ ๊ธด ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„ ๊ตฌ์„ฑํ•˜๊ฒŒ๋˜๋Š” ์กฐํ•ฉ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‘ ๊ฒฝ์šฐ ์ค‘์—์„œ ๋” ํฐ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„ ๋งŒ๋“œ๋Š” ์ชฝ์„ ์„ ํƒํ•ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค.

Step 2 : Recursive Solution

์œ„ ๋…ผ๋ฆฌ๊ฐ€ ๊ฝค๋‚˜ ํƒ€๋‹นํ•˜๊ณ  ์ƒ๊ฐ์ด ๋“ ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ˆ˜์‹์œผ๋กœ ๋งŒ๋“ค์–ด๋ณด์ž.

c[i, j] ๊ฐ€ i, j ์‚ฌ์ด์˜ ์ตœ๋Œ€ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค๋ฉด, X ์™€ Y ์˜ ๋ฌธ์ž๊ฐ€ ๊ฐ™์„ ๋•Œ, ๋ฐ”๋กœ ์ด์ „ ์ตœ์žฅ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด์— 1์„ ๋”ํ•œ ๊ฐ’์„ ์ƒˆ๋กœ ์ €์žฅํ•˜๊ณ , ๋‘ ๋ฌธ์ž๊ฐ€ ๋‹ค๋ฅผ ๋•Œ๋Š” X์ชฝ ์ตœ์žฅ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด์™€ Y์ชฝ ์ตœ์žฅ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋ฅผ ๋น„๊ตํ•ด์„œ ๋” ํฐ ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค.

 

๊ทธ๋Ÿฐ๋ฐ ์œ„ ๊ณ„์‚ฐ์‹ ๋Œ€๋กœ ์ง„ํ–‰ํ•˜๋ฉด, ์šฐ๋ฆฌ๋Š” ๊ฒฐ๊ตญ ๋˜‘๊ฐ™์€ ์—ฐ์‚ฐ์„ ๊ณ„์†ํ•ด์„œ ํ•ด์•ผํ•˜๋Š” ์ƒํ™ฉ์„ ๋งž์ดํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฐ ์ƒํ™ฉ์€ ์—ฐ์‚ฐ ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ•˜๊ฒŒ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ํ•œ๋ฒˆ ๊ณ„์‚ฐํ•œ ๊ฒฐ๊ณผ๋ฅผ ํ…Œ์ด๋ธ”์— ์ €์žฅํ•ด๋‘๊ณ  ์žฌ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ์‹œ๋„ํ•ด์•ผํ•œ๋‹ค.

Step 3 : Computing the Optimal Costs

์ด๋ฏธ ๊ณ„์‚ฐํ•œ ๊ฐ’์„ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ 2์ฐจ์› ๋ฐฐ์—ด์„ ํ†ตํ•ด ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์–ด ์ด ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณด์ž.

Y\X 0 A B C B D A B
0                
B                
D                
C                
A                
B                
A                

์œ„์™€ ๊ฐ™์ด ํ…Œ์ด๋ธ”์„ ์„ธํŒ…ํ•˜์ž. ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  X์˜ ๋ฌธ์ž์— ๋Œ€ํ•ด์„œ Y์˜ ๋ฌธ์ž๋ฅผ ๊บผ๋‚ด์™€ ๋น„๊ตํ•ด์„œ ์œ„์—์„œ ์ž‘์„ฑํ–ˆ๋˜ ์ˆ˜์‹์— ๋”ฐ๋ผ ๊ฐ’์„ ์ฑ„์›Œ ๋„ฃ์ž. ์ฒซ ๋ช‡ ๊ฐœ๋ฅผ ์ง„ํ–‰ํ•ด๋ณด๋ฉด,

Y\X 0 A B C B D A B
0 0 0 0 0 0 0 0 0
B 0 0 1 1 1 1 1 1
D 0              
C 0              
A 0              
B 0              
A 0              

B์— ๋Œ€ํ•œ ํ–‰์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฑ„์šธ ์ˆ˜ ์žˆ๋‹ค. A๋ฅผ ๋งŒ๋‚ฌ์„ ๋•Œ๋Š” ์ด์ „ ๊ฐ’ ์ค‘์— ์ œ์ผ ํฐ 0์„ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  B๋ฅผ ๋งŒ๋‚˜๊ฒŒ ๋˜๋ฉด Xi ์™€ Yj ์˜ ๊ฐ’์ด ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— ์ด์ „ ์œ„์น˜์˜ ๊ฐ€์žฅ ๊ธด ๊ธธ์ด์ธ 0์— 1์„ ๋”ํ•ด 1๋กœ ์ฑ„์›Œ์ฃผ๊ณ  ์žˆ๋‹ค. C๋ฅผ ์ฒดํฌํ•ด๋ณด๋ฉด B์™€ C๋Š” ๋‹ค๋ฅธ ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์—, X๋ฅผ ์ œ์™ธ ํ–ˆ์„ ๋•Œ, ์ฆ‰ ๋ฐ”๋กœ ์™ผ์ชฝ์— ์žˆ๋Š” ๊ฐ’๊ณผ, Y๋ฅผ ์ œ์™ธํ–ˆ์„ ๋•Œ, ์ฆ‰ ์ขŒ์ธก ๋Œ€๊ฐ์„  ์œ„์— ์žˆ๋Š” ๊ฐ’ ์ค‘์— ๋” ํฐ ๊ฐ’์œผ๋กœ ๋ฐฐ์—ด์„ ์ฑ„์›Œ์ฃผ๊ฒŒ ๋œ๋‹ค. ์ด ๋…ผ๋ฆฌ๋Œ€๋กœ ํ…Œ์ด๋ธ”์„ ๋ชจ๋‘ ์ฑ„์›Œ๋‚˜๊ฐ€๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ๋ฅผ ์™„์„ฑ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

Y\X 0 A B C B D A B
0 0 0 0 0 0 0 0 0
B 0 0 1 1 1 1 1 1
D 0 0 1 1 1 2 2 2
C 0 0 1 2 2 2 2 2
A 0 1 1 2 2 2 3 3
B 0 1 2 2 3 3 3 4
A 0 1 2 2 3 3 4 4

์œ„ ํ‘œ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ ์šฐ๋ฆฌ๊ฐ€ ์–ป์„ ์ˆ˜ ์žˆ๋Š” LCS์˜ ๊ธธ์ด๋Š” 4์ด๊ณ , ํ•ด๋‹น ๊ธธ์ด๋กœ ์กฐํ•ฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์€ ์ด 3์ข…๋ฅ˜๊ฐ€ ๋œ๋‹ค. ์™œ๋ƒํ•˜๋ฉด LCS๋Š” ์—ฌ๋Ÿฌ๊ฐœ๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๊ณ  ํ‘œ์—์„œ ์ตœ๋Œ€ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ์•„์ดํ…œ์˜ ๊ฐฏ์ˆ˜๊ฐ€ ๊ทธ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์˜๋ฏธํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์œ„์™€ ๊ฐ™์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๊ณ„์‚ฐ์„ ์ง„ํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด, ์šฐ๋ฆฌ๋Š” LCS๋ฅผ ๋‹จ์ˆœํžˆ ํ‘œ์˜ ๋ชจ๋“  ์œ„์น˜๋ฅผ ์ˆœํšŒํ•˜๋Š” ๊ฒƒ์„ ํ†ตํ•ด ์•Œ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์—ฐ์‚ฐ ์†๋„๋Š” ๐›ฉ(mn) ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์œ„ ํ‘œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ LCS์ธ ์„œ๋ธŒ์ŠคํŠธ๋ง์„ ์–ป์œผ๋ ค๋ฉด LCS ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์•„์ดํ…œ ์œ„์น˜๋ถ€ํ„ฐ ์™ผ์ชฝ์œผ๋กœ ์ด๋™ํ•˜๋ฉด์„œ, X์™€ Y๊ฐ€ ๊ฐ™์€ ์•ŒํŒŒ๋ฒณ๋“ค์„ ๊ธฐ๋กํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ์—ฌ๋Ÿฌ ๋ฌธ์ž์—ด์ด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์ง€๋งŒ ํ•˜๋‚˜๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด๋ณด๋ฉด, B -> A -> D -> B ์˜ ์—ญ์ˆœ์œผ๋กœ ๋‚˜์—ดํ•œ ๋ฌธ์ž์—ด์ธ BDAB ๊ฐ€ ํ•˜๋‚˜์˜ LCS๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.

Step 4: Constructing an Optimal Solution

์ด์ œ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•ด๋ณด์ž. LCS ๋ฌธ์ œ๋Š” ๊ฝค๋‚˜ ์œ ๋ช…ํ•œ ๋ฌธ์ œ์ด๊ธฐ ๋•Œ๋ฌธ์— [๋ฐฑ์ค€ ์•Œ๊ณ ๋ฆฌ์ฆ˜] ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

๋ฌธ์ œ: https://www.acmicpc.net/problem/9251

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int dp[1001][1001];

int main()
{
    string s1, s2;

    cin >> s1 >> s2;
    int lcs = 0;

    for (int i = 1; i <= s2.size(); i++)
    {
        for (int j = 1; j <= s1.size(); j++)
        {
            dp[i][j] = dp[i - 1][j];
            if (s2[i - 1] == s1[j - 1])
            {
                dp[i][j] = dp[i - 1][j - 1] + 1;
                lcs = max(lcs, dp[i][j]);
            }
            else
            {
                if (dp[i - 1][j] > dp[i][j - 1])
                    dp[i][j] = dp[i - 1][j];
                else
                    dp[i][j] = dp[i][j - 1];
            }
        }
    }

    cout << lcs;
    return 0;
}