Notice
Recent Posts
Link
정화 코딩
[컴퓨터알고리즘] LCS 알고리즘 구현 본문
1. LCS 알고리즘 설명
어떤 두 문자열이 얼마나 유사한지를 수치화하기 위해 longest common subsequence(LCS)를 구한다. LCS란 공통 문자열 중 길이가 가장 긴 문자열을 말한다. 이 때 공통 문자열을 이루는 문자들 사이에 다른 문자열이 있어도 상관없으며 공통 문자열을 이루는 문자들의 순서만 동일하면 된다. LCS가 길수록 두 문자열이 유사도가 높다고 할 수 있다. 이 LCS의 길이와 LCS를 구하는 알고리즘이 LCS 알고리즘이며, 이를 직접 코드로 구현해보고자 한다.
2. LCS 알고리즘 구현 코드 (python)
입력: 첫번째 줄에 문자열 X를 입력하고 두번째 줄에 문자열 Y를 입력한다. (문자열을 입력할 때는 문자와 문자 사이에 공백을 두고 입력한다.)
출력: 첫번째 줄에 LCS의 길이를 출력하고 두번째 줄에 그 LCS 중 하나를 출력한다.
import sys
input = sys.stdin.readline
def LCSlength(x, y, m, n):
b = [[0 for _ in range(n + 1)] for _ in range(m + 1)] # 테이블 b 선언 및 초기화
c = [[0 for _ in range(n + 1)] for _ in range(m + 1)] # 테이블 c 선언 및 초기화
for i in range(1, m + 1): # i : 행을 나타내는 변수
for j in range(1, n + 1): # j : 열을 나타내는 변수
if x[i - 1] == y[j - 1]: # X의 i번째 문자와 Y의 j번째 문자가 같을 때
c[i][j] = c[i - 1][j - 1] + 1 # 대각선의 값 + 1
b[i][j] = '↖'
else: # X의 i번째 문자와 Y의 j번째 문자가 같지 않을 때
if c[i - 1][j] >= c[i][j - 1]: # 위쪽의 값이 더 클 경우
c[i][j] = c[i - 1][j] # 위쪽의 값을 그대로
b[i][j] = '↑'
else: # 왼쪽의 값이 더 클 경우
c[i][j] = c[i][j - 1] # 왼쪽의 값을 그대로
b[i][j] = '←'
return b, c
def printLCS(b, x, i, j):
if i == 0 or j == 0: # 테이블의 끝에 도달하면 종료
return
if b[i][j] == '↖':
printLCS(b, x, i - 1, j - 1) # 대각선 칸으로 이동
print(x[i - 1], end = ' ') # 출력 (x[i - 1] == y[j - 1])
elif b[i][j] == '↑':
printLCS(b, x, i - 1, j) # 위쪽 칸으로 이동
else:
printLCS(b, x, i, j - 1) # 왼쪽 칸으로 이동
x = ''.join(input().split()) # 공백을 기준으로 나누어서 문자열로 저장
y = ''.join(input().split()) # 공백을 기준으로 나누어서 문자열로 저장
m = len(x) # m : X의 길이
n = len(y) # n : Y의 길이
b, c = LCSlength(x, y, m, n)
print("length of LCS :", c[m][n]) # length of longest common subsequence
print("LCS : ", end = '')
printLCS(b, x, m, n) # longest common subsequence
3. 출력 결과 화면
1) 입력: A B C B D A B
B D C A B A
출력: length of LCS : 4
LCS : B C B A
2) 입력: 1 0 0 1 0 1 0 1
0 1 0 1 1 0 1 1 0
출력: length of LCS : 6
LCS : 1 0 0 1 1 0
3) 입력: A C C G G T C G A G T
G T C G T T C G G A A T
출력: length of LCS : 7
LCS : C G T C G A T
'Data Structure & Algorithm' 카테고리의 다른 글
파이썬으로 이진 탐색 구현 (0) | 2023.09.05 |
---|---|
이진 탐색 (Binary Search) (0) | 2023.09.04 |
파이썬으로 스택, 큐, 덱 구현 (0) | 2023.08.25 |
정렬 (Sorting) (0) | 2023.01.18 |
스택, 큐, 덱 (Stack, Queue, Deque) (0) | 2023.01.09 |
Comments