일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 1057번
- 프로그래머스
- 신규아이디추천
- 파이썬
- BinaryGap
- 9251번
- 알고리즘
- 11047번
- Spring Security
- codility
- 입이 트이는 영어
- 18406번
- EBS어학당
- python
- WebSecurityConfigurerAdapter
- programmers
- 1992번
- 권주현의 진짜 영국 영어
- 11727번
- 1759번
- SecurityFilterChain
- 1793번
- caniuse
- 2163번
- Java
- 백준
- github
- 영어
- 2630번
- 분할정복
Archives
- Today
- Total
철갑이의 이모저모
[백준] 9251번(LCS) with Python 본문
728x90
문제
풀이
먼저 LCS(Longest Common Subsequence, 최장 공통 부분 수열)는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 부분을 말한다.
예시로 ACAYKP와 CAPCAK를 이용해 표를 그려보았다.
ACAYKP를 비교 대상으로 잡고 CAPCAK 문자열 하나씩 추가하면서 공통 수열 길이 값을 표시해준다.
위와 같이 반복을 하다보면 규칙을 찾을 수 있다.
행은 이전 행의 값과 같고, 같은 문자가 나오는 경우 이전 값에 +1을 하고 있는 것을 알 수 있다.
최종으로 작성된 표는 이렇게 나오게 된다. 즉, LSC는 4라는 것을 알 수 있다.
답
import sys
A = sys.stdin.readline().strip().upper()
B = sys.stdin.readline().strip().upper()
lcs = [[0] * (len(A)+1) for _ in range(len(B)+1)]
for i in range(1,len(B)+1) :
for j in range(1,len(A)+1) :
if B[i-1] == A[j-1] :
lcs[i][j] = lcs[i-1][j-1] + 1
else :
lcs[i][j] = max(lcs[i][j-1], lcs[i-1][j])
print(lcs[-1][-1])
728x90
'알고리즘' 카테고리의 다른 글
[Programmers] 모의고사 with Python (0) | 2020.11.24 |
---|---|
[백준] 11047번(동전 0) with Python (0) | 2020.11.24 |
[백준] 1992번(쿼드트리) with Python (0) | 2020.10.17 |
[백준] 2630번(색종이 만들기) with Python (2) | 2020.10.17 |
[백준] 1759번(암호 만들기) with Python (0) | 2020.10.13 |