9251๋ฒˆ:LCS

Jung Seo Kyungยท2019๋…„ 12์›” 19์ผ
0

๐Ÿ”— ๋ฌธ์ œ โˆ™ 9251๋ฒˆ: LCS

๋ฌธ์ œ

LCS(Longest Common Subsequence, ์ตœ์žฅ ๊ณตํ†ต ๋ถ€๋ถ„ ์ˆ˜์—ด) ๋ฌธ์ œ๋Š” ๋‘ ์ˆ˜์—ด์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋ชจ๋‘์˜ ๋ถ€๋ถ„ ์ˆ˜์—ด์ด ๋˜๋Š” ์ˆ˜์—ด ์ค‘ ๊ฐ€์žฅ ๊ธด ๊ฒƒ์„ ์ฐพ๋Š” ๋ฌธ์ œ์ด๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, ACAYKP ์™€ CAPCAK์˜ LCS๋Š” ACAK๊ฐ€ ๋œ๋‹ค.

์ž…๋ ฅ

์ฒซ์งธ, ๋‘˜์งธ ์ค„์— ๋‘ ๋ฌธ์ž์—ด์ด ์ฃผ์–ด์ง€๊ณ , ๋ฌธ์ž์—ด์€ ์•ŒํŒŒ๋ฒณ ๋Œ€๋ฌธ์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ , ์ตœ๋Œ€ 1000๊ธ€์ž๋กœ ์ด๋ฃจ์–ด์ ธ์žˆ๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„ ๋‘ ๋ฌธ์ž์—ด์˜ LCS์˜ ๊ธธ์ด๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

๐Ÿ”‘ ํ’€์ด

์ด ๋ฌธ์ œ๋Š” ์ „ํ˜•์ ์ธ dynamic programming ๋ฌธ์ œ์ด๋‹ค. ํ•„์ˆ˜์ ์œผ๋กœ ์•Œ์•„์•ผ ํ•˜๋Š” ๋ฌธ์ œ๋ผ๊ณ  ํ•จ.

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

์ฒซ ์ค„์„ ๋ณด๋ฉด, ๋ฌธ์ž์—ด A์˜ ์ฒซ๋ฒˆ์งธ ๋ฌธ์ž์—ด ๋ถ€ํ„ฐ ๋น„๊ตํ•œ๋‹ค. ๋ฌธ์ž์—ด B๋Š” ''๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค.

  • (A, '') ์™€ ๊ฐ™์ด ๋นˆ ๋ฌธ์ž์—ด๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ๋Š”, ๊ณตํ†ต๋˜๋Š” ๋ถ€๋ถ„์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— 0์œผ๋กœ ์ดˆ๊ธฐํ™” ๋˜์–ด์žˆ๋‹ค.

  • (A, C)
    A, C๋Š” ๊ฐ™์ง€ ์•Š๋‹ค. ํ•ด๋‹น ๋‹จ๊ณ„์—์„œ ๊ฐ€์ ธ๊ฐ€๋Š” ๊ฐ’์€ 0. ์ด์ „ ๋‹จ๊ณ„๋“ค์—์„œ ์ค‘๋ณต๋˜๋Š” ๋ฌธ์ž์—ด์ด ์žˆ์—ˆ๋‹ค๋ฉด ์ถ”๊ฐ€ ๋˜์—ˆ์„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— (A, ''), ('', C) ๋น„๊ต์—์„œ ์–ป์€ ๊ฐ’๋“ค ์ค‘ ์ตœ๋Œ€ ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค(์œ„์˜ ํ•‘ํฌ์ƒ‰ ๋ถ€๋ถ„๋“ค). ๋‘˜๋‹ค 0 ์ด๋ฏ€๋กœ, A,C ๋น„๊ต ๋‹จ๊ณ„์—์„œ ์ตœ๋Œ€ ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด๋Š” 0

  • (A, CA)
    A์™€ A๋Š” ๊ฐ™๋‹ค. ํ•ด๋‹น ๋‹จ๊ณ„์—์„œ ๋ถ€๋ถ„ ์ˆ˜์—ด์€ A๋กœ ๊ธธ์ด๊ฐ€ 1์ด ๋˜์—ˆ๋‹ค. ๋ฌธ์ž์—ด A์—์„œ์˜ 'A'์™€ ๋ฌธ์ž์—ด B์—์„œ 'A' ๋ชจ๋‘ ๊ณ ๋ คํ•˜์—ฌ 1๋กœ ์ถ”๊ฐ€ํ•œ ๊ฒƒ์ด๋‹ค.
    ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ด์ „ ๋‹จ๊ณ„์—์„œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฐ’์„ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋Š”๋ฐ ์ด๋ฏธ ๊ฐ ๋ฌธ์ž์—ด์—์„œ ํ˜„์žฌ A๋ฅผ ๋ถ€๋ถ„์ˆ˜์—ด๋กœ ์ถ”๊ฐ€ํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์—, ์ด์ „ ๋‹จ๊ณ„๋Š” ์ด A๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์€ ๋ฐ”๋กœ ์ „ ๋‹จ๊ณ„๋ฅผ ์ƒ๊ฐ ํ•ด์•ผํ•œ๋‹ค. (A, CA) ์—์„œ ๋ชจ๋‘ A๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š๋Š” ์ง€์ ์€ ('', C) ๋น„๊ต ์ง€์ ์ด๋‹ค. ์ด ๋‹จ๊ณ„์˜ ๊ฐ’์€ 0 ์ด๊ธฐ ๋•Œ๋ฌธ์—
    ํ˜„์žฌ ๋‹จ๊ณ„ ๊ฐ’ + ์ด์ „ ๋‹จ๊ณ„ = 1+ 0 = 1 ์ด ๋œ๋‹ค.

  • (A, CAP)
    A์™€ P๋Š” ๊ฐ™์ง€ ์•Š๋‹ค.
    ์ด์ „ ๋‹จ๊ณ„๋Š” (A, CA) ๋น„๊ต ์ง€์ , ('', CAP) ๋น„๊ต ์ง€์ ์ด ๋œ๋‹ค. ์ด๋ฅผ ์ˆ˜์น˜ํ™” ํ•˜๋ฉด ๊ฐ๊ฐ dp[i, j-1], dp[i-1, j] ์ง€์ ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.
    ํ˜„์žฌ ๊ฐ’์ด ๊ฐ™์ง€ ์•Š์„ ๊ฒฝ์šฐ์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๊ณ , 'A'์™€ 'CAP' ๋ฌธ์ž๋ฅผ ๋น„๊ตํ•˜์˜€์„ ๋•Œ ์ตœ๋Œ€ ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด๋Š” 1์ด ๋œ๋‹ค.

 dp[i][j] = max(dp[i][j-1], dp[i-1][j])
  • (A, CAPC)
    A, C๋Š” ๊ฐ™์ง€ ์•Š๊ณ , ์œ„์™€ ๋™์ผํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ง„ํ–‰ํ•œ๋‹ค.

  • (A, CAPCA)
    A, A๋Š” ๊ฐ™๋‹ค.
    ํ•ด๋‹น 'A'๋ฅผ ๋ถ€๋ถ„ ์ˆ˜์—ด๋กœ ์ถ”๊ฐ€ํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด์ „ ๋‹จ๊ณ„์—์„œ ํ˜„์žฌ ๋ถ€๋ถ„ ์ˆ˜์—ด 'A'์˜ ๊ธธ์ด์ธ 1์„ ๋”ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ์ด์ „ ๋‹จ๊ณ„๋Š” ์ด 'A'๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์€ ('', CAPC) ๊ฐ€ ๋˜๊ณ  ํ•ด๋‹น ๋‹จ๊ณ„๋Š” dp[i-1][j-1]๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
    ๋”ฐ๋ผ์„œ

dp[i][j] = dp[i-1][j-1]+1

์œ„์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ (ACAYKP, CAPCAK)๋ฅผ ๋น„๊ตํ•ด๋‚˜๊ฐ€๋ฉด dp[len(A)][len(B)]์œ„์น˜์— ์ตœ์žฅ ๋ถ€๋ถ„ ์ˆ˜์—ด ๊ธธ์ด๊ฐ€ ์˜ค๊ฒŒ ๋œ๋‹ค.

์ฝ”๋“œ

A = input()
B = input()

dp = [[0] * (len(A)+1) for _ in range(len(B)+1)]

for i in range(1, len(A)+1):
  for j in range(1, len(B)+1):
    if A[i-1] == B[j-1]:
      dp[i][j] = dp[i-1][j-1]+1
    else:
      dp[i][j] = max(dp[i][j-1], dp[i-1][j])

print(dp[len(A)][len(B)])

๐Ÿ›Ž ํŒจ์ŠคํŠธ ์บ ํผ์Šค: ์•Œ๊ณ ๋ฆฌ์ฆ˜/ ์ž๋ฃŒ๊ตฌ์กฐ ์˜จ๋ผ์ธ ๊ฐ•์˜์˜ ํ•ด์„ค์„ ์ฐธ๊ณ ํ•˜์˜€์Œ.

  • ์ฐธ๊ณ ํ–ˆ๋Š”๋ฐ, ๊ตฌ์ฒด์ ์œผ๋กœ ์™œ ์ด๋ ‡๊ฒŒ ๋˜๋Š”์ง€์— ๋Œ€ํ•ด์„œ๋Š” ๊ฐ•์˜ ์„ค๋ช…์ด ๋„˜ ๋ถ€์กฑํ•œ ๊ฒƒ ๊ฐ™๋‹คใ…  ๋‚ด๊ฐ€ ์ดํ•ด๋ ฅ์ด ๋ถ€์กฑํ•œ ๊ฒƒ์ผ ์ˆ˜ ๋„ ์žˆ.
    ์–ด์จŒ๋“  ๋‘๋‡Œ ํ’€๊ฐ€๋™ ํ•˜์—ฌ ํ’€์ด์˜ ๊ทผ๊ฑฐ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์•˜๋Š”๋ฐ ๋งž๋Š” ์„ค๋ช…์ธ์ง€๋„ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค. dp ๋ฌธ์ œ๋ฅผ ์ข€ ๋” ํ’€๊ณ  ๋‹ค๋ฅธ ํ’€์ด๋“ค๋„ ์ฐธ๊ณ  ํ•ด๋ด์•ผ๊ฒ ์Œ.

0๊ฐœ์˜ ๋Œ“๊ธ€