[Baekjoon/๐Ÿฅ‡โ…ค] 9251: LCSโญ

2 ๋ถ„ ์†Œ์š”

๐Ÿ™‹โ€โ™€๏ธ LCS

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

์˜ˆ๋ฅผ ๋“ค์–ด, ACAYKP์™€ CAPCAK์˜ LCS๋Š” ACAK๊ฐ€ ๋œ๋‹ค.

๐Ÿ™‹โ€โ™€๏ธ ์ž…๋ ฅ

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

๐Ÿ™‹โ€โ™€๏ธ ์ถœ๋ ฅ

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


๐Ÿ‘ฉโ€๐Ÿ’ป Algoritm: dp ์ ์šฉ

ํ•ด๋‹น ๋ฌธ์ œ๋Š” ์‹œ๊ฐ„ ์ œ์•ฝ์ด ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์–ด๋–ป๊ฒŒ ์ฝ”๋“œ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ž‘์„ฑํ•˜๋‚˜๊ฐ€ ๋ฌด์ฒ™ ์ค‘์š”ํ•˜๋‹ค.

์ด ๋ฌธ์ œ์—์„œ๋Š” dp๋ฅผ ํ†ตํ•ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. 1์ฐจ์› ๋ฐฐ์—ด์˜ ๋ˆ„์ ๊ฐ’์„ ํ†ตํ•ด ํ•ด๊ฒฐํ•  ์ˆ˜๋„ ์žˆ๊ณ , 2์ฐจ์› ๋ฐฐ์—ด์˜ ์บ์‹œ๋ฅผ ๋งŒ๋“ค์–ด ํ•ด๊ฒฐํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

โŒจ๏ธ dp: ๋ˆ„์ ํ•ฉ

  • ๋ฌธ์ž์—ดa๋ฅผ ๊ธฐ์ค€์œผ๋กœ 1์ฐจ์› ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•œ๋‹ค.
  • ๋ฌธ์ž์—ดb์˜ ๋ฌธ์ž ํ•˜๋‚˜ํ•˜๋‚˜๋ฅผ ๋Œ ๋•Œ๋งˆ๋‹ค ๋ฌธ์ž์—ดa ์ „์ฒด๋ฅผ ํ™•์ธํ•œ๋‹ค.
    • ๋ฌธ์ž๊ฐ€ ๊ฐ™์„ ๊ฒฝ์šฐ, ํ•ด๋‹น ์œ„์น˜ ์ „๊นŒ์ง€์˜ ์ตœ๋Œ€ ๋ˆ„์ ํ•ฉ + 1๋กœ ๋ˆ„์ ํ•ฉ์„ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.

์ฝ”๋“œ๋ฅผ ํ†ตํ•ด์„œ ์œ„ ๊ณผ์ •์„ ํ™•์ธํ•ด๋ณด์ž!!

๋ˆ„์ ํ•ฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜1: ์‹œ๊ฐ„์ดˆ๊ณผ

str1 = input()
str2 = input()

if str1 == str2:
  print(len(str1))
else:
  dp = [0]*len(str1)

  for i in range(len(str2)):
    for j in range(len(dp)-1, -1, -1):
      if str2[i] == str1[j]:
        try:
          dp[j] = max(dp[0:j])+1
        except:
          dp[j] = 1

  print(max(dp))
  • ์—…๋ฐ์ดํŠธ๋˜๋Š” ๋ˆ„์ ํ•ฉ์ด ๋‹ค์Œ ๋‹จ๊ณ„์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ๋‘ ๋ฒˆ์งธ ๋ฐ˜๋ณต๋ฌธ์—์„œ๋Š” ๋ฌธ์ž์—ด์„ ๋์—์„œ ๋ถ€ํ„ฐ ํ™•์ธํ•œ๋‹ค.
  • ๋ฌธ์ž์—ด์˜ ์ฒซ ๋ฒˆ์งธ ์›์†Œ์ผ ๋•Œ๋Š” ํ•ด๋‹น ์œ„์น˜ ์ „ ๋ˆ„์ ํ•ฉ์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— 1์„ ์„ค์ •ํ•ด์ค€๋‹ค.


ํ•ด๋‹น ํ’€์ด๋Š” ๋‹จ์ˆœ ๋ฐ˜๋ณต๋ฌธ์ด๋ฏ€๋กœ pypy3๋กœ๋Š” ๊ฐ„์‹ ํžˆ ํ†ต๊ณผํ•˜์ง€๋งŒ python3๋กœ๋Š” ์‹œ๊ฐ„์ดˆ๊ณผ์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค. ์œ„ ํ’€์ด์—์„œ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ ๋•Œ๋งˆ๋‹ค max๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ถ€๋ถ„์ด ์‹œ๊ฐ„์„ ๋งŽ์ด ์žก์•„๋จน๋Š” ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•ด ํ•ด๋‹น ๋ถ€๋ถ„์„ ๊ณ ๋ คํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•˜์˜€๋‹ค.


๋ˆ„์ ํ•ฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜2

str1 = input()
str2 = input()

if str1 == str2:
  print(len(str1))
else:
  dp = [0]*len(str1)

  for i in range(len(str2)):
    v_max = 0 # max ๊ฐ’ ์ €์žฅ ๋ณ€์ˆ˜
    for j in range(len(str1)):
      if dp[j] > v_max: # max ๊ฐ’ ์—…๋ฐ์ดํŠธ
        v_max = dp[j]
      elif str1[j] == str2[i]: # max+1 ๊ฐ’์œผ๋กœ ๋ˆ„์ ํ•ฉ ์—…๋ฐ์ดํŠธ
        dp[j] = v_max + 1
    print(dp)
  
  print(max(dp))

์ด๋ ‡๊ฒŒ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ˆ˜์ •ํ•˜๋ฉด ํ˜„์ €ํžˆ ์†๋„๊ฐ€ ๋นจ๋ผ์ง„ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


โŒจ๏ธ dp: 2์ฐจ์› ๋ฐฐ์—ด ์บ์‹œ ์‚ฌ์šฉ

ํ•ด๋‹น ํ’€์ด๋Š” ์œ„ ํ’€์ด์™€๋Š” ๋‹ค๋ฅด๊ฒŒ 2์ฐจ์› ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•œ๋‹ค. ๊ทธ ๊ณผ์ •์„ ๊ทธ๋ฆผ์„ ํ†ตํ•ด ์•Œ์•„๋ณด์ž!!

  • ํ•˜๋‚˜์˜ ๋ฌธ์ž์—ดb์˜ ๋ฌธ์ž ํ•˜๋‚˜ํ•˜๋‚˜๋ฅผ ๋Œ ๋•Œ๋งˆ๋‹ค ๋ฌธ์ž์—ดa ์ „์ฒด๋ฅผ ํ™•์ธํ•œ๋‹ค.
    • ๋ฌธ์ž๊ฐ€ ๊ฐ™์„ ๊ฒฝ์šฐ ํ•ด๋‹น ๊ธ€์ž๊ฐ€ ์žˆ๊ธฐ ์ „์˜ LCS ๊ฐ’ + 1๋กœ dp ๊ฐ’์„ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.
    • ๋ฌธ์ž๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅผ ๊ฒฝ์šฐ, ๊ทธ ์ƒํ™ฉ์—์„œ์˜ ์ตœ๋Œ€ LCS ๊ฐ’์„ dp์— ์ €์žฅํ•œ๋‹ค.

์ด์ œ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด์„œ ์œ„ ๊ณผ์ •์„ ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณด์ž!

str1 = input()
str2 = input()
matrix = [[0]*(len(str2)+1) for _ in range(len(str1)+1)]

for i in range(1, len(str1)+1):
  for j in range(1, len(str2)+1):
    if str1[i-1] == str2[j-1]:
      matrix[i][j] = matrix[i-1][j-1] + 1
    else:
      matrix[i][j] = max(matrix[i][j-1], matrix[i-1][j])

print(matrix[-1][-1])


๐Ÿ“ ์ฐธ๊ณ  ์ž๋ฃŒ

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ