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

๋ฐฑ์ค€ 9251 ํŒŒ์ด์ฌ - LCS - ๋™์  ๊ณ„ํš๋ฒ•

by ๐ŸŒปโ™š 2021. 10. 18.

๋ฐฑ์ค€ 9251 ํŒŒ์ด์ฌ

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

 

9251๋ฒˆ: LCS

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

www.acmicpc.net

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

์˜ˆ๋ฅผ ๋“ค์–ด 

ACAYKP

CAPCAK

LCS๋Š” ACAK ์ด๋‹ค.

 

์ด์ „์— ํ’€์—ˆ๋˜ ๋™์  ๊ณ„ํš๋ฒ•์ด๋ž‘์€ ์กฐ๊ธˆ ๋‹ค๋ฅด๊ฒŒ 2์ฐจ์› ๋ฐฐ์—ด์˜ ์บ์‹œ๋ฅผ ๋งŒ๋“ค์–ด์„œ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ณ ... ๋ˆ„์  ๊ฐ’์„ ๊ตฌํ•ด์„œ ํ•ด๊ฒฐํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 

 

Python ํ’€์ด 1

ํ•ด๋‹น ํ’€์ด๋Š” 2์ฐจ์› ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•œ ๋™์  ๊ณ„ํš๋ฒ•์ด๋‹ค.

2์ฐจ์› ๋ฐฐ์—ด์˜ ์บ์‹œ๊ฐ’์„ ๋งŒ๋“ค์–ด ๋™์  ๊ณ„ํš๋ฒ•์œผ๋กœ ํ’€๋•Œ๋Š” 2๊ฐœ์˜ ๋ฌธ์ž์—ด์˜ ํ˜„์žฌ ์‹œ์ ์—์„œ LCS ๊ฐ’์„ ๊ตฌํ•˜๋Š” ์›๋ฆฌ๋‹ค. ๋ฐฐ์—ด์„ ์ฑ„์šฐ๊ธฐ ์œ„ํ•ด ๋ฌธ์ž์—ด์˜ ์•ŒํŒŒ๋ฒณ์„ ์ˆœํšŒํ• ๋•Œ... ๋งŒ์•ฝ ๊ฐ™์€ ์•ŒํŒŒ๋ฒณ์ธ ๊ฒฝ์šฐ ํ•ด๋‹น ์œ„์น˜์—์„œ๋Š” ๊ธ€์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์ „์˜ LCS ๊ฐ’๋ณด๋‹ค 1์„ ๋”ํ•ด์„œ ์ €์žฅํ•œ๋‹ค. ์ด์ค‘ for๋ฌธ์œผ๋กœ i, j๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ์œ„์น˜๊ฐ€ [i-1][j-1]์˜ ์œ„์น˜์ด๋‹ค. ๋งŒ์•ฝ ์•ŒํŒŒ๋ฒณ์ด ๋‹ค๋ฅธ ๊ฒฝ์šฐ... ์ด์ „๊นŒ์ง€ ๋น„๊ตํ•œ ๊ฐ’์ค‘ ์ตœ๋Œ€๊ฐ’์„ ๊ตฌํ•ด์•ผํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด...  CAP์™€ ACA๋ฅผ ๋น„๊ตํ• ๋•Œ ๋งˆ์ง€๋ง‰ ๊ธ€์ž์ธ P์™€ A๋Š” ์„œ๋กœ ๋‹ค๋ฅด๋‹ค. ๊ทธ๋ž˜์„œ ์ด์ „๊นŒ์ง€ ๊ตฌํ•œ ๊ฐ’... CAP, AC = 1 ๊ทธ๋ฆฌ๊ณ  CA, ACA = 2 ๋‘๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธด๋‹ค. ์ด์ค‘ ์ตœ๋Œ€๊ฐ’์ด CAP์™€ ACA๊นŒ์ง€์˜ LCS๊ฐ€ ๋ ๊ฒƒ์ด๋‹ค.

 

import sys
read = sys.stdin.readline

word1, word2 = read().strip(), read().strip()
h, w = len(word1), len(word2)
cache = [[0] * (w+1) for _ in range(h+1)]

for i in range(1, h+1):
    for j in range(1, w+1):
        if word1[i-1] == word2[j-1]:
            cache[i][j] = cache[i-1][j-1] + 1
        else:
            cache[i][j] = max(cache[i][j-1], cache[i-1][j])
print(cache[-1][-1])
  • ์ด์ „ ๊ฐ’์„ ๊ฐ–๊ณ  ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธ€์ž์˜ ํฌ๊ธฐ๋ณด๋‹ค 1๋‚˜์”ฉ ํฌ๊ฒŒ cache๋ฐฐ์—ด์„ ์ง€์ •ํ•œ๋‹ค.
  • ๊ธ€์ž๊ฐ€ ๊ฐ™์€ ๊ฒฝ์šฐ ์ด์ „ ๊ฐ’์—์„œ 1์„ ๋”ํ•˜๊ณ  ๊ธ€์ž๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ 2๊ฐ€์ง€ ๊ฒฝ์šฐ์˜ ์ˆ˜์—์„œ ์ตœ๋Œ€๊ฐ’์„ ์ €์žฅํ•œ๋‹ค.
  • ์ตœ์ข…์ ์œผ๋กœ ๋ฐฐ์—ด์˜ ๋งˆ์ง€๋ง‰ ๊ฐ’์ด ๋‹ต์ด ๋œ๋‹ค.

์ฃผ์˜ํ•ด์•ผํ•  ๊ฒƒ์ด ์žˆ๋‹ค๋ฉด... ๊ฐ๊ฐ ๊ธ€์ž์˜ ํฌ๊ธฐ๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๊ธ€์ž์˜ index๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ง€์ •ํ•ด์ค˜์•ผํ•œ๋‹ค.

 

 

Python ํ’€์ด 2

๋‘๋ฒˆ ์งธ ํ’€์ด๋„ ๋™์  ๊ณ„ํš๋ฒ•์ด๊ณ  2์ค‘ for๋ฌธ์„ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ๊ฒƒ์€ ๊ฐ™๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ cache๋ฅผ 1์ฐจ์› ๋ฐฐ์—ด๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์–ด ํ’€์ด 1์—์„œ 2์ฐจ์› ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋Š”๋ฐ ๋“ค์–ด๊ฐ€๋Š” ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ๋„ ์ ˆ์•ฝ๋˜๊ณ  ์‹œ๊ฐ„๋„ ๋Œ€๋žต 2.5๋ฐฐ์ •๋„ ๊ฐœ์„ ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์—ˆ๋‹ค.

 

๊ธ€์ž ํ•˜๋‚˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ 1์ฐจ์› ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์ฃผ๊ณ  ๊ฐ™์€ ๊ธ€์ž๋ฅผ ์ˆœํšŒํ•˜๋Š” ๊ฒฝ์šฐ ๋ˆ„์  ๊ฐ’์—์„œ 1์„ ๋”ํ•œ ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ˆœํšŒํ•  ๋•Œ๋งˆ๋‹ค ๋ˆ„์ ๊ฐ’์„ ์ €์žฅํ•  ๋ณ€์ˆ˜๋ฅผ ํ•˜๋‚˜ ์‚ฌ์šฉํ•˜๊ณ  ๋งŒ์•ฝ ๊ธ€์ž๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ ๋ˆ„์  ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ํ•ด๋‹น ์œ„์น˜์˜ ๊ฐ’๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ ํ•ด๋‹น ๊ฐ’์œผ๋กœ ๊ต์ฒดํ•ด์ค€๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ˆ„์  ๊ฐ’์—๋Š” ์ด์ „ ์œ„์น˜๊นŒ์ง€ ๊นŒ์ง€์˜ ์ตœ๋Œ€๊ฐ’์ด ๊ณ„์†ํ•ด์„œ ์ €์žฅ๋œ๋‹ค.

 

import sys
read = sys.stdin.readline

word1, word2 = read().strip(), read().strip()
l1, l2 = len(word1), len(word2)
cache = [0] * l2

for i in range(l1):
    cnt = 0
    for j in range(l2):
        if cnt < cache[j]:
            cnt = cache[j]
        elif word1[i] == word2[j]:
            cache[j] = cnt + 1
print(max(cache))
  • cnt๋ฅผ ๋ˆ„์  ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
  • ๋ˆ„์  ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ์บ์‹œ๊ฐ’๋ณด๋‹ค ์ž‘์œผ๋ฉด ๊ต์ฒดํ•œ๋‹ค.
  • ๊ธ€์ž๊ฐ€ ๊ฐ™์€ ๊ฒฝ์šฐ ๋ˆ„์  ๋ณ€์ˆ˜์—์„œ 1์„ ๋”ํ•œ๋‹ค.

์ฃผ์˜ํ•ด์•ผํ•  ์‚ฌํ•ญ์€... ๋ˆ„์ ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ํ•ด๋‹น ์œ„์น˜์˜ ์บ์‹œ๊ฐ’๋ณด๋‹ค ์ž‘์€์ง€ ์—ฌ๋ถ€๋ถ€ํ„ฐ ํ™•์ธํ•ด์•ผํ•œ๋‹ค.

XXXXXF

XFXXXQ

๋ฐ˜๋ก€๋กœ ์ด ๋‘ ๋ฌธ์ž์—ด์„ ์˜ˆ์‹œ๋กœ ํ–ˆ์„๋•Œ ๋งŒ์•ฝ ๊ธ€์ž๊ฐ€ ๊ฐ™์€์ง€๋ฅผ ๋จผ์ € ๋น„๊ตํ•ด๋ฒ„๋ฆฌ๋ฉด... ๋ˆ„์  ๊ฐ’์ด ์ถ”๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค.

๋Œ“๊ธ€