๐Ÿ‘ฉ‍๐Ÿ’ป ํ”„๋กœ๊ทธ๋ž˜๋ฐ/๐ŸŽ ์•Œ๊ณ ๋ฆฌ์ฆ˜

์ตœ์žฅ ๊ณตํ†ต ๋ถ€๋ถ„ ์ˆ˜์—ด(LCS) cf. ์ตœ์žฅ ๊ณตํ†ต ๋ฌธ์ž์—ด

peewoong 2024. 4. 29. 18:31

๐ŸŸฉ LCS, ์ตœ์žฅ ๊ณตํ†ต ๋ถ€๋ถ„ ์ˆ˜์—ด Longest Common Subsequence (cf. Longest  Common Substring ์ตœ์žฅ ๊ณตํ†ต ๋ฌธ์ž์—ด)

 

์ตœ์žฅ ๊ณตํ†ต ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ฒฝ์šฐ, ๋ถ€๋ถ„์ˆ˜์—ด์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ž ์‚ฌ์ด๋ฅผ ๊ฑด๋„ˆ๋›ฐ์–ด ๊ณตํ†ต๋˜๋ฉด์„œ ๊ฐ€์žฅ ๊ธด ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„ ์ฐพ์œผ๋ฉด ๋œ๋‹ค.

์ตœ์žฅ ๊ณตํ†ต ๋ฌธ์ž์—ด์˜ ๊ฒฝ์šฐ, ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์—, ํ•œ ๋ฒˆ์— ์ด์–ด์ ธ ์žˆ๋Š” ๋ฌธ์ž์—ด๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

๐ŸŸฉ ์ตœ์žฅ ๊ณตํ†ต ๋ฌธ์ž์—ด

if i == 0 or j == 0:  # ๋งˆ์ง„ ์„ค์ •
	LCS[i][j] = 0
elif string_A[i] == string_B[j]:
	LCS[i][j] = LCS[i - 1][j - 1] + 1
else:
	LCS[i][j] = 0

 

LCS๋ผ๋Š” 2์ฐจ์› ๋ฐฐ์—ด์„ ์ด์šฉํ•˜์—ฌ ๋‘ ๋ฌธ์ž์—ด์„ ํ–‰, ์—ด์— ๋งค์นญํ•œ๋‹ค. ํŽธ์˜์ƒ i, j๊ฐ€ 0์ผ ๋•Œ๋Š” ๋ชจ๋‘ 0์„ ๋„ฃ์–ด์ค˜ ๋งˆ์ง„๊ฐ’์„ ์„ค์ •ํ•œ๋‹ค. ์ดํ›„ i, j๊ฐ€ 1์ด์ƒ์ผ ๋•Œ๋ถ€ํ„ฐ ๊ฒ€์‚ฌ๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค.

 

1. ๋ฌธ์ž์—ด A, B์˜ ํ•œ๊ธ€์ž์”ฉ ๋น„๊ตํ•œ๋‹ค.

2. ๋‘ ๋ฌธ์ž๊ฐ€ ๋‹ค๋ฅด๋‹ค๋ฉด LCS[i][j]์— 0์„ ํ‘œ์‹œํ•œ๋‹ค.

3. ๋‘ ๋ฌธ์ž๊ฐ€ ๊ฐ™๋‹ค๋ฉด LCS[i-1][j-1] ๊ฐ’์„ ์ฐพ์•„ +1 ํ•œ๋‹ค.

4. ์œ„ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

 

๊ณตํ†ต ๋ฌธ์ž์—ด์€ ์—ฐ์†๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ„ ๊ณผ์ •์ด ์„ฑ๋ฆฝ๋œ๋‹ค. ํ˜„์žฌ ๋‘ ๋ฌธ์ž๊ฐ€ ๊ฐ™์„ ๋•Œ ๋‘ ๋ฌธ์ž์˜ ์•ž ๊ธ€์ž๊นŒ์ง€๊ฐ€ ๊ณตํ†ต ๋ฌธ์ž์—ด์ด๋ผ๋ฉด ๊ณ„์† ๊ณตํ†ต ๋ฌธ์ž์—ด์ด ์ด์–ด์งˆ ๊ฒƒ์ด๊ณ , ์•„๋‹ˆ๋ผ๋ฉด ๋ณธ์ธ๋ถ€ํ„ฐ ๋‹ค์‹œ ๊ณตํ†ต ๋ฌธ์ž์—ด์„ ๋งŒ๋“ค์–ด ๊ฐ€๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค. 

 

๐ŸŸฉ ๊ตฌํ˜„๊ณผ์ •

 

๐ŸŸฉ ์ตœ์žฅ ๊ณตํ†ต ๋ถ€๋ถ„ ์ˆ˜์—ด

if i == 0 or j == 0:  # ๋งˆ์ง„ ์„ค์ •
	LCS[i][j] = 0
elif string_A[i] == string_B[j]:
	LCS[i][j] = LCS[i - 1][j - 1] + 1
else:
	LCS[i][j] = max(LCS[i - 1][j], LCS[i][j - 1])

 

1. ๋ฌธ์ž์—ด A, B์˜ ํ•œ๊ธ€์ž์”ฉ ๋น„๊ตํ•œ๋‹ค.

2. ๋‘ ๋ฌธ์ž๊ฐ€ ๋‹ค๋ฅด๋‹ค๋ฉด LCS[i - 1][j]์™€ LCS[i][j - 1] ์ค‘์— ํฐ ๊ฐ’์„ ํ‘œ์‹œํ•œ๋‹ค.

3. ๋‘ ๋ฌธ์ž๊ฐ€ ๊ฐ™๋‹ค๋ฉด LCS[i - 1][j -1] ๊ฐ’์„ ์ฐพ์•„ +1 ํ•œ๋‹ค.

4. ์œ„ ๊ณผ์ • ๋ฐ˜๋ณตํ•œ๋‹ค.

 

์ตœ์žฅ ๊ณตํ†ต ๋ฌธ์ž์—ด๊ณผ ๋‹ค๋ฅธ ๋ถ€๋ถ„์€ ๋น„๊ตํ•˜๋Š” ๋‘ ๋ฌธ์ž๊ฐ€ ๋‹ค๋ฅผ ๋•Œ์ด๋‹ค. ๋น„๊ตํ•˜๋Š” ๋‘ ๋ฌธ์ž๊ฐ€  ๊ฐ™์„ ๋•Œ๋Š” ๊ฐ™์€ ๊ณผ์ •์„ ๋ณด์—ฌ์ค€๋‹ค.

๋ถ€๋ถ„ ์ˆ˜์—ด์€ ์—ฐ์†๋œ ๊ฐ’์ด ์•„๋‹ˆ๋‹ค. ๋•Œ๋ฌธ์— ํ˜„์žฌ์˜ ๋ฌธ์ž๋ฅผ ๋น„๊ตํ•˜๋Š” ๊ณผ์ • ์ด์ „์˜ ์ตœ๋Œ€ ๊ณตํ†ต ๋ถ€๋ถ„์ˆ˜์—ด์€ ๊ณ„์†ํ•ด์„œ ์œ ์ง€ํ•œ๋‹ค. 'ํ˜„์žฌ์˜ ๋ฌธ์ž๋ฅผ ๋น„๊ตํ•˜๋Š” ๊ณผ์ •' ์ด์ „์˜ ๊ณผ์ •์ด ๋ฐ”๋กœ LCS[i-1][j]์™€ LCS[i][j-1]์ด ๋œ๋‹ค.

 

๐ŸŒŸ LCS[i-1][j]์™€ LCS[i][j-1] ์˜ ์˜๋ฏธ

 

๋ฌธ์ž์—ด AB์™€ GBC๋ฅผ ๋น„๊ตํ•˜๋Š” ๊ณผ์ •์„ ์˜ˆ๋กœ ๋“ ๋‹ค๋ฉด, AB์™€ GBC์˜ ์ตœ๋Œ€ ๊ณตํ†ต ๋ถ€๋ถ„์ˆ˜์—ด์ด B๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฌธ์ž์—ด A์™€ GBC๋ฅผ ๋น„๊ตํ•˜๋Š” ๊ณผ์ •, ๋ฌธ์ž์—ด AB์™€ GB๋ฅผ ๋น„๊ตํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค. ๋ฌธ์ž์—ด AB์™€ GB์˜ ๋น„๊ต ๊ณผ์ •์—์„œ ์ตœ๋Œ€ ๊ณตํ†ต ๋ถ€๋ถ„์ˆ˜์—ด์ด B์ž„์„ ํ™•์ธํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ž์—ด AB์™€ GBC์˜ ์ตœ๋Œ€ ๊ณตํ†ต ๋ถ€๋ถ„์ˆ˜์—ด ์—ญ์‹œ B๊ฐ€ ๋œ๋‹ค.

 

๐ŸŒŸ ์™œ ๋ฌธ์ž๊ฐ€ ๊ฐ™์œผ๋ฉด LCS[i][j] = LCS[i-1][j-1] +1์ธ๊ฐ€?

๋ถ€๋ถ„ ์ˆ˜์—ด์€ ์—ฐ์†๋  ํ•„์š”๊ฐ€ ์—†๋‹ค. ๋‘ ๋ฌธ์ž๊ฐ€ ๊ฐ™์€ ์ƒํ™ฉ์ด ์˜ค๋ฉด ์ง€๊ธˆ๊นŒ์ง€์˜ ์ตœ๋Œ€ ๊ณตํ†ต ๋ถ€๋ถ„์ˆ˜์—ด์— 1์„ ๋”ํ•ด์ฃผ๋Š” ๊ฒƒ

๋ฌธ์ž์—ด ABC์™€ GBC๋ฅผ ๋น„๊ตํ•˜๋Š” ๊ณผ์ •์„ ์˜ˆ๋กœ ๋“ค์ž๋ฉด, LCS ๋ฐฐ์—ด์€ LCS[i-1][j]์™€ LCS[i][j-1]์˜ ๋น„๊ต๋ฅผ ํ†ตํ•ด ์–ธ์ œ๋‚˜ ๋ณธ์ธ๊นŒ์ง€์˜ ์ตœ๋Œ€ ๊ณตํ†ต ๋ถ€๋ถ„์ˆ˜์—ด ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๋ฌธ์ž์—ด AB์™€ GB๋ฅผ ๋น„๊ตํ•  ๋•Œ์™€ ๋ฌธ์ž์—ด ABC์™€ GBC๋ฅผ ๋น„๊ตํ•  ๋•Œ ๋‹ฌ๋ผ์ง„ ์ ์€ ๋‘ ๋ฌธ์ž์—ด ๋ชจ๋‘์— C๊ฐ€ ์ถ”๊ฐ€๋œ ์ ์ด๋‹ค. ๋•Œ๋ฌธ์—  ๊ธฐ์กด์˜ ์ตœ๋Œ€ ๊ณตํ†ต ๋ถ€๋ถ„์ˆ˜์—ด์ธ B์— C๋ฅผ ๋”ํ•œ BC๊ฐ€ ์ตœ๋Œ€ ๊ณตํ†ต ๋ถ€๋ถ„์ˆ˜์—ด์ด ๋œ๋‹ค.

 

๐ŸŸฉ ๊ตฌํ˜„๊ณผ์ •

 

๐ŸŸฉ ์‹œ๊ฐ„๋ณต์žก๋„

๊ธธ์ด n๊ณผ m์ธ ๋‘ ์ŠคํŠธ๋ง์˜ LCS ๊ธธ์ด ๐Ÿ‘‰ O(nm)

๊ฐ๊ฐ ๊ธธ์ด n๊ณผ m์„ ์‚ฌ์šฉํ•˜๋Š” ์ค‘์ฒฉ๋œ ์ด์ค‘ ๋ฃจํ”„

 

ํ…Œ์ด๋ธ” LCS[][]๋กœ๋ถ€ํ„ฐ LCS๋ฅผ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๐Ÿ‘‰ O(n+m)

idx๊ฐ€ LCS ๊ธธ์ด๋งŒํผ ์ค„์–ด๋“ค ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๋Š” ํ˜•ํƒœ์˜ ๋ฃจํ”„๋กœ ๊ตฌ์„ฑ

์‹ค์ œ๋กœ๋Š” i=n, j=m๋ถ€ํ„ฐ ์ตœ๋Œ€ i=0, j=0๊นŒ์ง€ ๋„๋‹ฌ ๊ฐ€๋Šฅ

 

๐ŸŒŸ ์ตœ์žฅ ๊ณตํ†ต ๋ถ€๋ถ„ ์ˆ˜์—ด ์ฐพ๊ธฐ

์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜

1. LCS ๋ฐฐ์—ด์˜ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ๊ฐ’์—์„œ ์‹œ์ž‘ํ•œ๋‹ค. ๊ฒฐ๊ณผ๊ฐ’์„ ์ €์žฅํ•  result ๋ฐฐ์—ด์„ ์ค€๋น„ํ•œ๋‹ค.

2. LCS[i-1][j]์™€ LCS[i][j-1] ์ค‘ ํ˜„์žฌ ๊ฐ’๊ณผ ๊ฐ™์€ ๊ฐ’์„ ์ฐพ๋Š”๋‹ค.

๐Ÿ‘‰ 2-1. ๋งŒ์•ฝ ๊ฐ™์€ ๊ฐ’์ด ์žˆ๋‹ค๋ฉด, ํ•ด๋‹น ๊ฐ’์œผ๋กœ ์ด๋™

๐Ÿ‘‰ 2-2. ๋งŒ์•ฝ ๊ฐ™์€ ๊ฐ’์ด ์—†๋‹ค๋ฉด, result ๋ฐฐ์—ด์— ํ•ด๋‹น ๋ฌธ์ž๋ฅผ ๋„ฃ๊ณ , LCS[i-1][j-1]๋กœ ์ด๋™ํ•œ๋‹ค.

3. 2๋ฒˆ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋‹ค๊ฐ€ 0์œผ๋กœ ์ด๋™ํ•˜๊ฒŒ ๋˜๋ฉด ์ข…๋ฃŒํ•œ๋‹ค. result ๋ฐฐ์—ด์˜ ์—ญ์ˆœ์ด LCS์ด๋‹ค.

 


์ž๋ฃŒ ์ถœ์ฒ˜

https://velog.io/@emplam27/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EA%B7%B8%EB%A6%BC%EC%9C%BC%EB%A1%9C-%EC%95%8C%EC%95%84%EB%B3%B4%EB%8A%94-LCS-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-Longest-Common-Substring%EC%99%80-Longest-Common-Subsequence