티스토리 뷰
# 문제
문제
LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다.
예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.
입력
첫째 줄과 둘째 줄에 두 문자열이 주어진다. 문자열은 알파벳 대문자로만 이루어져 있으며, 최대 1000글자로 이루어져 있다.
출력
첫째 줄에 입력으로 주어진 두 문자열의 LCS의 길이를 출력한다.
# 나의 풀이
- 접근
먼저 완전탐색으로 접근하였지만, 방법이 생각나지 않았다.
유튜브 강의를 통해 학습하였다.
bottom - up 방식으로 2차원 dp 테이블을 채워나가는 것이 핵심이다.
여기서 처음으로 배운 것
1. 부분 문자열을 다른 표현방식으로 치환
2. dp table을 구할 때 다양한 조건식 사용
3. 2차원 dp 테이블을 활용할 것
4. 초기값 0을 dp 테이블을 선언 시 초기화 한것


# 최종 제출 코드
# 최장 공통 부분 수열(LCS) 10월6일 복습
import sys
read = sys.stdin.readline
# 입출력 시간 개선
string1, string2 = read().strip(), read().strip()
X = len(string1) + 1
Y = len(string2) + 1
dp = [[0] * Y for _ in range(X)] # dp 테이블 초기화
for y in range(1, Y):
for x in range(1, X):
if string1[y-1] == string2[x-1]:
dp[y][x] = dp[y-1][x-1] + 1
else:
dp[y][x] = max(dp[y][x-1], dp[y-1][x])
print(dp[-1][-1])
더 배울 것
부분 문자열의 길이가 뿐 아닌 그 문자열을 찾는 방식 학습
인덱스 경계값 철저히 확인하기
'파이썬 > DP' 카테고리의 다른 글
| 포도주 시식 (실버 1) (1) | 2024.01.05 |
|---|---|
| 다리 놓기 (실버 5) (0) | 2024.01.04 |
| Unique Paths (0) | 2023.10.05 |
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- C++
- 자료구조
- 그래프 순회
- 가중치 그래프
- deque
- 파일 내용 찾기 프로그램
- javascript
- 파이썬
- 메모리
- BFS
- 골드5
- dp
- 함수
- JSON
- 재귀
- 그래프
- 완전탐색
- Bottom-up
- 다익스트라
- dfs
- 백준
- 그래프 탐색
- 알고리즘
- 브루트포스
- os모듈
- 프론트엔드
- 변수
- 시뮬레이션
- 힙
- 덱
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
글 보관함