๊ด€๋ฆฌ ๋ฉ”๋‰ด

๐Ÿ’ป๐Ÿ’ญ๐ŸŽง๐ŸŒ

BOJ 9251 : LCS (Python) ๋ณธ๋ฌธ

์•Œ๊ณ ๋ฆฌ์ฆ˜/๋ฐฑ์ค€ ํ’€์ด

BOJ 9251 : LCS (Python)

adorableco 2023. 2. 7. 22:35
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

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

 

9251๋ฒˆ: LCS

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

www.acmicpc.net

 

 

 

์ฝ”๋“œ

st1 = list(input())
st2 = list(input())

if len(st1)<len(st2):
    array1 = st1
    array2 = st2
else:
    array1 = st2
    array2 = st1

order = [0] * len(array1)
dp = [1] * len(array1)
result = 0

for i in range(len(array2)):
    if array1.count(array2[i]) == 0:
        array2[i] = 0

while array2.count(0)!=len(array2):
    for i in range(len(array1)):
        if array1[i] in array2:
            order[i] = (array2.index(array1[i]))+1
            array2[array2.index(array1[i])] = 0
    for i in range(len(array1)):
        if order[i] != 0:
            for j in range(0,i):
                if order[j]!=0 and order[j] < order[i]:
                    dp[i] = max(dp[i] , dp[j]+1)
    if result < max(dp):
        result = max(dp)
    dp = [1] * len(array1)

print(result)

 

 

 

ํ’€์ด

 

๋ฌธ์ž์—ด ๋ฆฌ์ŠคํŠธ์˜ ์ธ๋ฑ์Šค ๊ฐ’์„ ์ด์šฉํ•ด LIS๋กœ ํ•ด๊ฒฐํ•  ๊ฒƒ์ด๋‹ค.

 

array1 ์— ๋” ๊ธด ๋ฌธ์ž์—ด ๋ฆฌ์ŠคํŠธ๋ฅผ, array2์— ๋” ์งง์€ ๋ฌธ์ž์—ด ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‹ด๋Š”๋‹ค.

array1์— array2์˜ ์•ŒํŒŒ๋ฒณ์ด ํ•˜๋‚˜๋„ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ทธ ์•ŒํŒŒ๋ฒณ ์ž๋ฆฌ์—  ์ˆซ์ž 0์„ ๋Œ€์‹  ๋„ฃ์–ด๋‘”๋‹ค.

→ ์• ์ดˆ์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์•ŒํŒŒ๋ฒณ์ด๋ผ๋Š” ๊ฑธ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด

 

array1์˜ ์•ŒํŒŒ๋ฒณ(array1์˜ i๋ฒˆ์งธ  ์ธ๋ฑ์Šค์— ์žˆ๋Š” ๋ฌธ์ž)์ด array2์— ์กด์žฌํ•˜๋ฉด order[i] ์— array2์—์„œ ๊ทธ ์•ŒํŒŒ๋ฒณ์ด ์กด์žฌํ•˜๋Š” (์ธ๋ฑ์Šค+1) ๊ฐ’์„ ๋Œ€์ž…ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  array2์—์„œ ๊ทธ ์•ŒํŒŒ๋ฒณ์ด ์œ„์น˜ํ•˜๋˜ ์ž๋ฆฌ์—๋Š” 0์„ ๋Œ€์ž…ํ•ด์„œ ์ด๋ฏธ ์ฒดํฌํ•œ ๊ณณ์ž„์„ ํ‘œ์‹œํ•œ๋‹ค.

→ ๋’ค์— array1์—์„œ ๋˜ ๊ฐ™์€ ์•ŒํŒŒ๋ฒณ์ด ๋‚˜์™”์„ ๋•Œ array2์—์„œ ์ด๋ฏธ ์ฒดํฌํ•œ ๊ณณ์€ ๋„˜๊ธฐ๊ณ  ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด์„œ

 

array1์˜ ์•ŒํŒŒ๋ฒณ์„ ๋‹ค ํ™•์ธํ–ˆ์„ ๋•Œ๋งˆ๋‹ค LIS ๋ฅผ ์ด์šฉํ•ด ๋‹ต(๋ณ€์ˆ˜ result)์„ ๊ตฌํ•œ๋‹ค. ์ƒˆ๋กœ ๊ตฌํ•œ result๊ฐ’์ด ์ด์ „์˜ result๊ฐ’๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ์—๋Š” result์˜ ๊ฐ’์„ ์ƒˆ๋กœ ๊ตฌํ•œ ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธํ•œ๋‹ค. 

 

array2์˜ ์•ŒํŒŒ๋ฒณ์„ ๋ชจ๋‘ ํ™•์ธํ–ˆ์„ ๋•Œ while๋ฌธ์„ ์ข…๋ฃŒํ•œ๋‹ค. (array2์— ์žˆ๋Š” 0์˜ ๊ฐœ์ˆ˜๊ฐ€ array2์˜ ๊ธธ์ด์™€ ๊ฐ™์•„์งˆ ๋•Œ)

 

์˜ˆ์‹œ)

์ฒซ๋ฒˆ์งธ ์ค„ : order ๋ฆฌ์ŠคํŠธ ๊ฐ’

๋‘๋ฒˆ์งธ ์ค„ : array1 ACAYKP

์„ธ๋ฒˆ์งธ ์ค„ : array2 CAPCAK

 

1. ์ฒ˜์Œ์—๋Š” ์ด๋ ‡๊ฒŒ ๊ตฌ์„ฑ์ด ๋ผ์žˆ๋‹ค.

0 0 0 0 0 0
A C A Y K P
C A P C A K

2. array1์˜ 0๋ฒˆ ์ธ๋ฑ์Šค๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ๊ทธ ์•ŒํŒŒ๋ฒณ์ด array2์— ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

์ง€๊ธˆ์€ array2์˜ 2๋ฒˆ์งธ ์œ„์น˜์— A๊ฐ€  ์žˆ์œผ๋ฏ€๋กœ order[0]์— 2๋ผ๊ณ  ์ €์žฅํ•ด๋‘๊ณ  array2์˜ 2๋ฒˆ์งธ ์œ„์น˜์˜ ์•ŒํŒŒ๋ฒณ์€ 0์œผ๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค. 

2 0 0 0 0 0
A C A Y K P
C 0 P C A K

3. ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ณ„์† ์ง„ํ–‰ํ•œ๋‹ค.

2 1 0 0 0 0
A C A Y K P
0 0 P C A K

4. array1์„ ํ•œ๋ฐ”ํ€ด ๋‹ค ๋Œ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋œ๋‹ค.

2 1 5 0 6 3
A C A Y K P
0 0 0 C 0 0

order ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•ด LIS๋ฅผ ๊ตฌํ•˜๋ฉด ํ˜„์žฌ result ๋Š” [2,5,6] ์œผ๋กœ 3์ด ๋œ๋‹ค.

์•„์ง array2 ์ „์ฒด๊ฐ€ 0์ด ์•„๋‹ˆ๋ฏ€๋กœ ํ•œ๋ฒˆ ๋” for๋ฌธ์„ ๋Œ๋ฆฌ๋ฉด

 

5. ์•„๋ž˜์™€ ๊ฐ™์ด ๋œ๋‹ค.

2 4 5 0 6 3
A C A Y K P
0 0 0 0 0 0

์—ฌ๊ธฐ์—์„œ order ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•ด LIS๋ฅผ ๊ตฌํ•˜๋ฉด ํ˜„์žฌ result๋Š” [2,4,5,6]์œผ๋กœ 4๊ฐ€ ๋œ๋‹ค.

 

array2์˜ ๊ฐ’์ด ๋ชจ๋‘ 0์ด ๋˜์—ˆ์œผ๋ฏ€๋กœ(array2์˜ ์•ŒํŒŒ๋ฒณ์„ ๋ชจ๋‘ ์ฒดํฌํ•จ.) while๋ฌธ์€ ์ข…๋ฃŒ๋œ๋‹ค.

๋‹ต์€ 4๋‹ค!

 

์˜ค๋ฅ˜...

BNBNBN ๊ณผ NB ๋ฅผ ์ž…๋ ฅํ–ˆ์„ ๋•Œ๋Š” ๋‹ต์ด 2๊ฐ€ ๋‚˜์™€์•ผํ•˜๋Š”๋ฐ 1์ด ๋‚˜์˜จ๋‹ค. ์ด๋ฏธ ์ฒดํฌํ•œ ์•ŒํŒŒ๋ฒณ์€ ๋‹ค์‹œ ๋ณผ ์ˆ˜ ์—†์–ด์„œ ๋ฐœ์ƒํ•œ ์˜ค๋ฅ˜์ธ ๊ฒƒ ๊ฐ™์€๋ฐ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๋„์ €ํžˆ ๋ชจ๋ฅด๊ฒ ๋‹ค..

๋ฐ˜์‘ํ˜•