문제
LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다.
예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.
입력
첫째 줄과 둘째 줄에 두 문자열이 주어진다. 문자열은 알파벳 대문자로만 이루어져 있으며, 최대 1000글자로 이루어져 있다.
출력
첫째 줄에 입력으로 주어진 두 문자열의 LCS의 길이를 출력한다.
내가 푼 풀이
- dp[i][j] = 길이 i인 문자 s1과 길이 j인 문자 s2 의 가장 긴 수열의 길이라 한다.
- s1, s2 문자열을 순회한다.
- 문자가 같으면 dp[i-1][j-1] + 1
- 문자가 다르면 max( dp[i-1][j], dp[i][j-1] )
A | C | A | Y | K | P | ||
0 | 0 | 0 | 0 | 0 | 0 | 0 | |
C | 0 | 0 | 1 | 1 | 1 | 1 | 1 |
A | 0 | 1 | 1 | 2 | 2 | 2 | 2 |
P | 0 | 1 | 1 | 2 | 2 | 2 | 3 |
C | 0 | 1 | 2 | 2 | 2 | 2 | 3 |
A | 0 | 1 | 2 | 3 | 3 | 3 | 3 |
K | 0 | 1 | 2 | 3 | 3 | 4 | 4 |
import Foundation
var str1 = readLine()!
var str2 = readLine()!
var strArr1 = ["0"] + str1.map{String($0)}
var strArr2 = ["0"] + str2.map{String($0)}
var dp = Array(repeating: Array(repeating: 0, count: str1.count+1), count: str2.count+1)
for i in 1...str2.count {
for j in 1...str1.count {
if strArr2[i] == strArr1[j] {
dp[i][j] = dp[i-1][j-1] + 1
} else {
dp[i][j] = max(dp[i-1][j], dp[i][j-1])
}
}
}
print(dp[str2.count][str1.count])
'코딩테스트 > 백준' 카테고리의 다른 글
BOJ-1541 잃어버린 괄호 Swift (0) | 2023.05.04 |
---|---|
BOJ-11399 ATM Swift (1) | 2023.05.03 |
BOJ-11052 카드 구매하기 Swift (0) | 2023.04.28 |
BOJ-1904 01타일 Swift (1) | 2023.04.27 |
BOJ-12865 평범한 배낭 Swift (1) | 2023.04.26 |