IT/백준
[백준] 9251 LCS (Python)
ziasu
2021. 10. 5. 11:39
반응형
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])
반응형