Notice
Recent Posts
Recent Comments
Link
REC
백준 9251번: LCS (G5) - Python 풀이 본문
SMALL
문제 설명
https://www.acmicpc.net/problem/9251
LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다.
예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.
입력
첫째 줄과 둘째 줄에 두 문자열이 주어진다. 문자열은 알파벳 대문자로만 이루어져 있으며, 최대 1000글자로 이루어져 있다.
출력
첫째 줄에 입력으로 주어진 두 문자열의 LCS의 길이를 출력한다.
예제 입력 1
ACAYKP
CAPCAK
예제 출력 1
4
풀이 과정
일반적으로 LCS (Longest Common Subsequence) 알고리즘은 두 문자열 A, B가 입력으로 주어질 때 양쪽 문자열 모두에 등장하는 부분 수열 중 가장 긴 것을 찾는 문제입니다.
DP로 접근해서 풀 수 있습니다.
문자열 A의 길이를 n, B의 길이를 m이라고 할 때, DP 테이블은 DP[i][j] = A의 앞 i 글자, B의 앞 j 글자에서의 LCS 길이 로 정의할 수 있습니다.
점화식은 아래와 같습니다.
0. DP의 0번째 열과 행은 0으로 초기화
1. 문자가 같은 경우
DP[i][j] = DP[i-1][j-1] + 1
→ 해당 문자가 LCS에 포함되기 때문에 길이를 1 증가시킨다.
2. 문자가 다른 경우
DP[i][j] = max(DP[i-1][j], DP[i][j-1])
→ A 또는 B 한쪽에서 문자를 버리고 최적 해를 이어간다.
정답 코드
first = list(input())
second = list(input())
first_len = len(first)
second_len = len(second)
# 0으로 초기화
DP = [[0 for _ in range(second_len + 1)] for _ in range(first_len + 1)]
for i in range(1, first_len + 1):
for j in range(1, second_len + 1):
# 값이 같으면
if first[i-1] == second[j-1]:
# 왼쪽 대각선 위의 값에 +1
DP[i][j] = DP[i-1][j-1] + 1
# 값이 다르면
else:
# 바로 위의 값과 왼쪽의 값 중 더 큰 값을 취한다
DP[i][j] = max(DP[i-1][j], DP[i][j-1])
# 2차원 배열 다 살펴보고 마지막 값이 정답
print(DP[i][j])
이상입니다.
LIST
'Algorithm' 카테고리의 다른 글
| 백준 15686번: 치킨 배달 (G5) - Python 풀이 (0) | 2025.09.15 |
|---|---|
| 백준 1916번: 최소비용 구하기 (G5) - Python 풀이 (0) | 2025.09.04 |
| 백준 1629번: 곱셈 (S1) - Python 풀이 (0) | 2025.09.01 |
| 백준 1027번: 고층 건물 (G4) - Python, Swift 풀이 (1) | 2025.08.24 |
| 백준 1932번: 정수 삼각형 (S1) - Python 풀이 (2) | 2025.08.16 |