์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ/BOJ_Python

[BOJ/Step15] 9251 : LCS (Python)

NaNaRin๐Ÿ™ƒ 2021. 3. 4. 11:35

www.acmicpc.net/problem/9251

 

9251๋ฒˆ: LCS

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

www.acmicpc.net


์–ด์šฐ ๋„ˆ๋ฌด ์–ด๋ ค์› ๋‹ค

๋ฌธ์ œ์„ ๋ฐฑ๋ฒˆ ์ฝ์–ด๋„ ๋Œ€์ฒด ์ด๊ฑธ ์–ด๋–ป๊ฒŒ ํ’€์–ด์•ผํ•˜๋‚˜ ๋ชจ๋ฅด๊ฒ ๋Š”.. ๊ทธ๋Ÿฐ...

๊ทธ๋ž˜์„œ ์ฐพ์•„๋ดค๋Š”๋ฐ DP์˜ ์œ ๋ช…ํ•œ ๋ฌธ์ œ๋ผ๋”๋ผ LCS..

์•„๋‹ˆ๋‚˜๋‹ค๋ฅผ๊นŒ ํ’€์ด ๋ฐฉ๋ฒ•์„ ๋ดค๋Š”๋ฐ๋„ ์ดํ•ดํ•˜๋Š”๋ฐ ํ•œ์ฐธ ๊ฑธ๋ ธ๋‹ค

๋‹ค๋“ค ์•„... ์ด๋ ‡๊ฒŒ ํ‘ธ๋Š”๊ตฌ๋‚˜๋งŒ ์„ค๋ช…ํ•˜๊ณ  ์™œ ์ด๋ ‡๊ฒŒ ํ‘ธ๋Š”์ง€๋Š” ์„ค๋ช…์„ ์•ˆํ•ด์ฃผ์…”๊ฐ€์ง€๊ณ  ๋„ˆ๋ฌด ๊ดด๋กœ์› ๋‹ค

๋ญ ์„ค๋งˆ ๋‹ค๋“ค ํ’€์ด ๋ฐฉ๋ฒ•์„ ๋ณด๋ฉด ๋ฒˆ์ฉ ํ•˜๊ณ  ์ด์œ ๊ฐ€ ์ดํ•ด๋˜๋Š”๊ฑด๊ฐ€ ๋‚˜๋งŒ ์•ˆ๋˜๋Š”๊ฑด๊ฐ€ ใ„ดใ…‡ใ„ฑ

์•„๋ฌดํŠผ ๋จธ๋ฆฌ ์ฅ์–ด์‹ธ๋งค๊ณ  ์ดํ•ดํ–ˆ๋‹ค

 

๋‘๊ฐœ์˜ ๋ฌธ์ž์—ด์ด ์žˆ๋‹ค

0์œผ๋กœ ์ฑ„์›Œ์ง„ ํ‘œ๋ฅผ ์ฑ„์›Œ๋‚˜๊ฐ€๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ณ„์‚ฐํ•ด๋ณด์ž

 

๋ฌธ์ œ์˜ ์˜ˆ์ œ๋กœ ์ฃผ์–ด์ง„ ACAYKP์™€ CAPCAK์˜ ๊ฒฝ์šฐ

๊ฐ ์นธ์—๋Š” ๋งจ ์œ„์˜ ์•ŒํŒŒ๋ฒณ๊ณผ ๋งจ ์™ผ์ชฝ์˜ ์•ŒํŒŒ๋ฒณ์ด ์ถ”๊ฐ€๋˜์—ˆ์„ ๋•Œ์˜ LCS ๊ธธ์ด๋ฅผ ์ ๋Š”๋‹ค

์ฆ‰ (4, 4)์—๋Š” AC์— A๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์„ ๋•Œ, CA์— P๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์„ ๋•Œ์˜ LCS ๊ธธ์ด๋ฅผ ์ ์„ ๊ฒƒ์ด๋‹ค

(2, 2) : A์™€ C๋ฅผ ๋น„๊ตํ•œ๋‹ค. ์ค‘๋ณต๋˜๋Š” ์ˆ˜์—ด์ด ์—†์œผ๋ฏ€๋กœ 0

(2, 3) : AC์™€ C๋ฅผ ๋น„๊ตํ•œ๋‹ค. C๊ฐ€ ์ค‘๋ณต๋œ๋‹ค. 1

(2, 4) : ACA์™€ C๋ฅผ ๋น„๊ตํ•œ๋‹ค. ์ด์ „์— ์ด๋ฏธ C๊ฐ€ ์ค‘๋ณต๋˜์–ด 1์ด ๋˜์—ˆ์œผ๋ฏ€๋กœ 1

(2, 5) : ACAY์™€ C๋ฅผ ๋น„๊ตํ•œ๋‹ค. ์ด์ „์— ์ด๋ฏธ C๊ฐ€ ์ค‘๋ณต๋˜์–ด 1์ด ๋˜์—ˆ์œผ๋ฏ€๋กœ 1

(2, 6) : ACAYK์™€ C๋ฅผ ๋น„๊ตํ•œ๋‹ค. ์ด์ „์— ์ด๋ฏธ C๊ฐ€ ์ค‘๋ณต๋˜์–ด 1์ด ๋˜์—ˆ์œผ๋ฏ€๋กœ 1

(2, 7) : ACAYKP์™€ C๋ฅผ ๋น„๊ตํ•œ๋‹ค. ์ด์ „์— ์ด๋ฏธ C๊ฐ€ ์ค‘๋ณต๋˜์–ด 1์ด ๋˜์—ˆ์œผ๋ฏ€๋กœ 1

(3, 2) : A์™€ CA๋ฅผ ๋น„๊ตํ•œ๋‹ค. A๊ฐ€ ์ค‘๋ณต๋œ๋‹ค. 1

(3, 3) : AC์™€ CA๋ฅผ ๋น„๊ตํ•œ๋‹ค. ์ด์ „์— ์ด๋ฏธ A๊ฐ€ ์ค‘๋ณต๋˜์–ด 1์ด ๋˜์—ˆ๋ฏ€๋กœ 1. C๋„ ์ค‘๋ณต๋˜์ง€๋งŒ CA์™€ AC๋Š” ์ค‘๋ณต๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ 1 

(3, 4) : ACA์™€ CA๋ฅผ ๋น„๊ตํ•œ๋‹ค. CA๊ฐ€ ์ค‘๋ณต๋œ๋‹ค. 2

(3, 5) : ACAY์™€ CA๋ฅผ ๋น„๊ตํ•œ๋‹ค. ์ด์ „์— ์ด๋ฏธ CA๊ฐ€ ์ค‘๋ณต๋˜์–ด 2์ด ๋˜์—ˆ์œผ๋ฏ€๋กœ 2

(3, 6) : ACAYK์™€ CA๋ฅผ ๋น„๊ตํ•œ๋‹ค. ์ด์ „์— ์ด๋ฏธ CA๊ฐ€ ์ค‘๋ณต๋˜์–ด 2์ด ๋˜์—ˆ์œผ๋ฏ€๋กœ 2

(3, 7) : ACAYKP์™€ CA๋ฅผ ๋น„๊ตํ•œ๋‹ค. ์ด์ „์— ์ด๋ฏธ CA๊ฐ€ ์ค‘๋ณต๋˜์–ด 2์ด ๋˜์—ˆ์œผ๋ฏ€๋กœ 2

์œ„ ๊ณผ์ •์„ ๋ณด๋ฉด ๋…ธ๋ž€ ํ•˜์ด๋ผ์ดํŠธ ๋ถ€๋ถ„์˜ ๋‘ ์•ŒํŒŒ๋ฒณ์ด ๊ฐ™์„ ๋•Œ(= ๋งจ ์œ„์˜ ์•ŒํŒŒ๋ฒณ๊ณผ ๋งจ ์™ผ์ชฝ์˜ ์•ŒํŒŒ๋ฒณ์ด ๊ฐ™์„ ๋•Œ)

(x-1, y-1) + 1์ด ๋˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์–ด์งธ์„œ (x-1, y-1)์— 1์„ ๋”ํ•˜๋Š”๊ฐ€?

3์ž๋ฆฌ์ˆ˜์˜ S1๊ณผ 4์ž๋ฆฌ์ˆ˜์˜ S2์— ๊ฐ๊ฐ ๊ฐ™์€ ์•ŒํŒŒ๋ฒณ์ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ค๋ฉด

4์ž๋ฆฌ์ˆ˜์˜ S1๊ณผ 5์ž๋ฆฌ์ˆ˜์˜ S2๊ฐ€ ๋˜์–ด 3์ž๋ฆฌ์ˆ˜์˜ S1๊ณผ 4์ž๋ฆฌ์ˆ˜์˜ S2์ผ๋•Œ์˜ LCS์— 1์ด ์ถ”๊ฐ€๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค

 

์œ„๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ๋ฐ˜๋ณตํ•˜์—ฌ ํ‘œ๋ฅผ ๊ฐ€๋“ ์ฑ„์šฐ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

์—‡ ๊ทธ๋Ÿฐ๋ฐ ์œ„ ํ‘œ์— (5, 7)์„ ๋ณด๋ฉด ์•ŒํŒŒ๋ฒณ์ด ๊ฐ™์ง€๋„ ์•Š์€๋ฐ 3์ด ๋˜์—ˆ๋‹ค.

CAPC์™€ ACAYKP์˜ LCS๋ฅผ ๊ตฌํ•˜๋Š”๋ฐ ์–ด๋ผ CAP 3์ž๋ฆฌ๋‹ค.

CAP์™€ ACAYKP์˜ LCS ๋˜ํ•œ CAP 3์ž๋ฆฌ๋‹ค. CAP์— C๋ฅผ ์ถ”๊ฐ€ํ•ด๋„ ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.

(x, y)๋ฅผ ๊ตฌํ•  ๋•Œ (x-1, y) ์™€ (x, y-1)์„ ๋น„๊ตํ•˜์—ฌ ๋” ํฐ๊ฒƒ์„ ๊ฐ€์ ธ์˜ค๋ฉด ๋  ๋“ฏ ํ•˜๋‹ค.

 

์ด๋กœ์จ ์šฐ๋ฆฌ๋Š” (x, y) ๋ฅผ ๊ตฌํ•  ๋•Œ

1. x = y ๋ผ๋ฉด (x-1, y-1) + 1

2. x != y ๋ผ๋ฉด max( (x-1, y), (x, y-1))

๋ผ๋Š” ๊ฒƒ์„ ์•Œ์•„๋ƒˆ๋‹ค!

 

# 9251.py

s1 = str(input())
s2 = str(input())

s1s2 = [[0] * (len(s2) + 1) for _ in range(len(s1) + 1)]

for i in range(1, len(s1)+1):
    for j in range(1, len(s2)+1):
        if s1[i-1] == s2[j-1]:
            s1s2[i][j] = s1s2[i-1][j-1] + 1
        else:
            s1s2[i][j] = max(s1s2[i-1][j], s1s2[i][j-1])

print(s1s2[i][j])