-
반응형
1. 문제 조건
- 첫째줄과 둘째 줄에 비교할 수열이 주어짐(각각의 길이는 같지 않을 수 있음)(최대 1000글자(알파벳 대문자))
- 문자열을 비교했을 때 모두의 부분 수열이 되는 수열 중 가장 긴 것 찾기
2. 풀이 전 생각정리
- 수열 x와 y가 주어졌을 때 (x[0]과 y전부 비교하여 dp 갱신, x[1]과 y전부 비교하여 dp 갱신...) 이런 식으로 차근차근 dp를 갱신해보자
- dp의 크기는 (x의 길이+1) * (y의 길이+1) / 처음에는 다 0으로 채워넣어주기
- 이중 for문을 돌면서 두 가지 상황이 발생
- x의 값과 y값이 같을 때
- dp[i][j] = dp[i-1][j-1]+1
- x의 값과 y값이 같지 않을 때
- dp[i][j] = max(dp[i][j-1], dp[i-1][j])
- x의 값과 y값이 같을 때
- dp를 다 갱신하고 dp[-1][-1]을 출력하면 최종적으로 가장 긴 수열의 길이를 구할 수 있다.
3. 코드 구현
#두개의 문자열의 길이를 천천히 증가시켜보며 공통 부분 수열의 최대 길이를 갱신 #점화식 짜는게 중요(공집합 포함하여 추가) x = input() y = input() dp = [[0]*(len(y)+1) for _ in range(len(x)+1)] for i in range(1,len(x)+1): #x요소(i) 하나 당 y(j)를 전체 돌면서 갱신 for j in range(1,len(y)+1): if x[i-1] == y[j-1]: dp[i][j] = dp[i-1][j-1]+1 else: dp[i][j] = max(dp[i-1][j], dp[i][j-1]) print(dp[-1][-1])
반응형'IT > 백준' 카테고리의 다른 글
[백준] 11053 가장 긴 증가하는 부분 수열(Python) (0) 2021.10.11 [백준] 12865 평범한 배낭(Python) (0) 2021.10.11 [백준] 1495 기타리스트 (Python) (0) 2021.10.05 [백준] 17472 다리만들기2 (Python) (0) 2021.08.24 댓글