일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 그래프탐색
- 최장공통부분수열
- 수학
- 모듈러 연산 분배법칙
- 나는 바보야...
- lazy evaluation
- 다이나믹 프로그래밍
- 구현
- 깊이 우선 탐색
- 동적 계획법
- 일단 시도
- error:0308010C:digital envelope routines::unsupported
- 문자열
- 정처기 필기
- Container vs VM
- LCS 알고리즘
- 배낭 문제
- 파이썬
- Docker 원리
- bfs
- db replication
- 너비 우선 탐색
- 냅색 알고리즘
- 최장공통부분문자열
- 그래프 이론
- dfs
- 클래스
- Python
- 그래프 탐색
- npm start
Archives
- Today
- Total
Save my data
백준 9251 : LCS (파이썬) 본문
기본적인 LCS 알고리즘 문제이다.
LCS 알고리즘에 대해서는 어떤 분이 굉장히 자세히 써 놓으셨는데,
새로 배우는 입장에서 굉장히 이해가 쉽도록 그림자료까지 첨부가 되어 있어서 이해하기가 좋았다.
[알고리즘] 그림으로 알아보는 LCS 알고리즘 - Longest Common Substring와 Longest Common Subsequence
LCS는 주로 최장 공통 부분수열(Longest Common Subsequence)을 말합니다만, 최장 공통 문자열(Longest Common Substring)을 말하기도 합니다.
velog.io
나도 이번에 LCS 라는 알고리즘을 처음 보았는데 위 자료를 참고하여 풀었다.
import sys
S1 = sys.stdin.readline().strip()
S2 = sys.stdin.readline().strip()
N = len(S1)
M = len(S2)
dp = [[0] * (M + 1) for _ in range(N + 1)]
for i in range(1, N + 1):
for j in range(1, M + 1):
if S1[i - 1] == S2[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])
사실 두 번 "틀렸습니다" 당했는데,
너무 당연한 사실 두 가지를 간과하였던 것이었다.
- sys.stdin.readline() 을 쓰면 개행문자가 딸려 오기 때문에 뒤에 스트립을 해서 개행문자를 벗겨내야 한다.
- 문제에서 예시 입력으로 주어진 두 문자열의 길이가 같아서 무심코 N = len(S1) 으로 두 개의 for 문을 돌려버렸다.
두 문자열의 길이가 같다는 말은 어디에도 써 있지 않고 당연한 사실이었는데 깊이 생각하지 않고 있다가 뒤통수를 얻어맞았다.
'알고리즘 & SQL > 백준' 카테고리의 다른 글
백준 9465 : 스티커 (파이썬) (1) | 2023.02.27 |
---|---|
백준 10811 : 바구니 뒤집기 (파이썬) (0) | 2023.02.27 |
백준 11052 : 카드 구매하기 (파이썬) (0) | 2023.02.24 |
백준 12865 : 평범한 배낭 (파이썬) (1) | 2023.02.23 |
백준 10815 : 숫자 카드 (파이썬) (0) | 2023.02.20 |
Comments