Study/BOJ

[BOJ] 9251, 15482. LCS, 한글 LCS

MuviSsum 2021. 4. 25. 20:38

www.acmicpc.net/problem/15482

 

15482번: 한글 LCS

첫째 줄과 둘째 줄에 두 문자열이 주어진다. 문자열은 최대 1000글자이고, 유니코드 U+AC00(가)부터 U+D7A3(힣)까지로만 이루어져 있으며, UTF-8로 인코딩 되어 있다.

www.acmicpc.net

www.acmicpc.net/problem/9251

 

9251번: LCS

LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.

www.acmicpc.net

문제: 문자열 2개에서 최장 공통 부분 수열을 찾아라.

 

문제 이해하기!!

LCS 문제입니다. (Longest Common Subsequence라고 하죠)

문제 제목에 한글 LCS 문제라고 되어있기 때문에 쉽게 알 수 있었어요!

두 문제는 영어랑 한글이 다른 것 뿐인데, 파이썬에서는 형에 대한 생각을 안해도 되니깐!! 둘 다 풀립니다.

자, 그럼 어떻게 풀어야 할까?

처음엔 완전탐색을 한다면 O(n**3)의 시간복잡도가 나옵니다.

그럼 이걸 줄여야겠죠? 문자열의 길이가 1000이니까 O(n**2)로만 줄여도 답이 나옵니다!

줄이기 위해서는 다이나믹 프로그래밍으로 풀면되는데요.

 

그 방식을 설명하자면!!

1. 하나의 0으로 된 dp배열을 만듭니다.

2. 한 문자열(a)을 돌면서 다른 문자열(b)에서 한 문자열(a) 1번째와 같은 것이 있는지 확인합니다.

3. 같다면 다른 문자열(b) 인덱스까지 저장된 dp배열 중 제일 컸던 것에 +1을 해서 dp배열에 수정해줍니다.

4. dp 배열 중 가장 큰 값을 출력해주면 됩니다.

끝~~!!

 

코드:

def s():
    s1, s2 = input(), input()
    dp = [0] * 1000
    for i in range(len(s1)):
        max_dp = 0
        for j in range(len(s2)):
            if max_dp < dp[j]:
                max_dp = dp[j]
            elif s1[i] == s2[j]:
                dp[j] = max_dp + 1
    print(max(dp))
s()
반응형

'Study > BOJ' 카테고리의 다른 글

[BOJ] 1238. 파티  (0) 2021.06.07
[BOJ] 14503. 로봇 청소기  (0) 2021.05.26
[BOJ] 12015, 12738. 가장 긴 증가하는 부분 수열 2, 3  (0) 2021.04.23
[BOJ] 20040. 사이클 게임  (0) 2021.04.18
[BOJ] 1717. 집합의 표현  (0) 2021.04.13