Algorithm Problem/Python

[python] ๋ฐฑ์ค€ - 9251. LCS

deo2kim 2020. 9. 22. 08:51
๋ฐ˜์‘ํ˜•

๐Ÿค”๋ฌธ์ œ ํ•ด๊ฒฐ

G5 | ๋‹ค์ด๋‚˜๋ฏนํ”„๋กœ๊ทธ๋ž˜๋ฐ, ๋ฌธ์ž์—ด

 

LCS๋ž€ ์ตœ์žฅ ๊ณตํ†ต ๋ถ€๋ถ„ ๋ฌธ์ž์—ด(Longest Common Subsequence)์ด๋‹ค.

์ˆœ์„œ๋Š” ๋งž์ง€๋งŒ ์—ฐ์†ํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ๊ฐ™์€ ๋ฌธ์ž์—ด์„ ์ฐพ๋Š” ๊ฒƒ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ABCAB์™€ BDCB๊ฐ€ ์žˆ๋‹ค. ABCAB ์™€ BDCB ์˜ LCS๋Š” BCB์ด๋‹ค.

 

LCS๊ฐ€ ๋ญ”์ง€ ์•ˆ๋‹ค๊ณ  ํ•ด๋„ ์ฒ˜์Œ ์ ‘ํ•˜๋ฉด ๊ตฌํ•˜๋Š”๊ฑด ๋‹น์—ฐํžˆ ์–ด๋ ต๋‹ค. ์™„์ „ํƒ์ƒ‰์„ ํ•˜๋ ค๊ณ  ํ–ˆ์ง€๋งŒ ์—ญ์‹œ๋‚˜ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. 

๋ฌธ์ œ ํ•ด๊ฒฐ๋ฒ•์ด DP์ด๊ณ  ๋‹ค๋ฅธ ๊ณ ์ˆ˜๋“ค์˜ ํ’€์ด๋ฐฉ๋ฒ•์„ ์ฐธ๊ณ ํ•ด์„œ ํ•ด๊ฒฐํ–ˆ๋‹ค.

๋จผ์ € ์œ„์™€ ๊ฐ™์ด DP๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค.

 

๋จผ์ € 1๋ฒˆ ์งธ ํ–‰์„ ์ฑ„์›Œ๋ณด๋ฉด

  • AC์™€ C๊ฐ€ ๋งŒ๋‚˜์„œ LCS๋Š” 1์ด๋‹ค.

๋‘๋ฒˆ ์งธ ํ–‰์„ ๋ณด์ž.

  • A์™€ CA๊ฐ€ ๋งŒ๋‚˜์„œ LCS๋Š” 1์ด๋‹ค.
  • ACA์™€ CA๊ฐ€ ๋งŒ๋‚˜์„œ LCS๋Š” 2์ด๋‹ค.

 

์„ธ๋ฒˆ ์งธ ํ–‰์„ ๋ณด์ž.

  • A์™€ CAP = 1
  • ACA์™€ CAP = 2
  • ACAYKP์™€ CAP = 3

์—ฌ๊ธฐ์„œ ๋‘๊ฐ€์ง€ ๊ทœ์น™์„ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

  • ๋ฌธ์ž๊ฐ€ ๊ฐ™์„ ๊ฒฝ์šฐ: ์ด์ „ ๋ฌธ์ž๊นŒ์ง€์˜ LCS + 1
    EX) ACAYKP์™€ CAP๋ฅผ ๋ดค์„ ๋•Œ P๊ฐ€ ๊ฐ™์€ ๋ฌธ์ž์ด๋‹ค.
    ๊ทธ๋ ‡๋‹ค๋ฉด ACAYK ์™€ CA ์˜ LCS ๋Š” 2์ด๊ณ  +1์„ ํ•ด์ฃผ๊ฒŒ ๋˜๋ฉด
    ACAYKP์™€ CAP ์˜ LCS ๋Š” 3์ด ๋œ๋‹ค.
  • ๋ฌธ์ž๊ฐ€ ๋‹ค๋ฅผ ๊ฒฝ์šฐ: ๋‘ ๋‹จ์–ด์—์„œ ๊ฐ๊ฐ์˜ ์ด์ „๋‹จ๊ณ„์˜ LCS ์ค‘ ํฐ ๊ฐ’
    EX) ACA์™€ CAP ์—์„œ A ์™€ P๊ฐ€ ๋‹ค๋ฅด๋ฏ€๋กœ ์ด์ „์˜ ๊ฐ’ LCS
    1. AC์™€ CAP = 1
    2. ACA์™€ CA = 2
    ์ด ๋‘˜ ์ค‘ max๊ฐ’์„ ๋„ฃ๋Š”๋‹ค.

์ด๋ ‡๊ฒŒ ๋งˆ์ง€๋ง‰๊นŒ์ง€ ๊ฐ€๊ฒŒ ๋œ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. dp์˜ ๋งˆ์ง€๋ง‰ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋ฉด ๋œ๋‹ค.

 

๐Ÿ’จ !์‹ฌํ™” ํ•™์Šต : ์ด์ œ LCS์˜ ๊ตฌ์„ฑ ๋ฌธ์ž๋ฅผ ๊ตฌํ•ด๋ณด์ž.

DP์˜ ๊ฐ€์žฅ ์•„๋ž˜์—์„œ ๋ถ€ํ„ฐ ๊ฐ ํ–‰์˜ ๊ฐ€์žฅ ํฐ๊ฐ’์ค‘ ์•ž์ชฝ์— ์žˆ๋Š” ๊ฐ’์„ ์„ ํƒํ•ด์ค€๋‹ค. 
( ํ•˜์ง€๋งŒ ๊ฐ ํ–‰๊ณผ ์—ด์€ ํ•˜๋‚˜์˜ ๊ฐ’๋งŒ ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ์šฐ๋ฆฌ๋Š” ACAK๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’ป์†Œ์Šค ์ฝ”๋“œ

def solution(a, b):
    a = ' ' + a
    b = ' ' + b
    an = len(a)
    bn = len(b)

    dp = [[0]*an for _ in range(bn)]
    for i in range(1, bn):
        for j in range(1, an):
            if b[i] == a[j]:
                dp[i][j] = dp[i-1][j-1] + 1

            else:
                dp[i][j] = max(dp[i-1][j], dp[i][j-1])

        for row in dp:
            print(row)
        print()
    print(dp[-1][-1])
    return


if __name__ == "__main__":
    a0 = input()
    b0 = input()
    solution(a0, b0)

 

๐Ÿ“•๋ฌธ์ œ ํ™•์ธ

์ถœ์ฒ˜: BACKJOON ONLINE JUDGE

๋งํฌ: 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๊ฐ€ ๋œ๋‹ค.

์ž…๋ ฅ

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

์ถœ๋ ฅ

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

๋ฐ˜์‘ํ˜•