본문 바로가기
알고리즘 풀이

LCS - DP 이용

by 남생이야 2024. 7. 13.

 

 

"GOOD MORNING. " 과 "GUTEN MORGEN." 문자열 비교 

 

int LCS(char* x, char* y, int i, int j, Table* table)
{
	// m행 1열에 0을 채운다.
	for (int m = 0; m <= i; m++)
		table->Data[m][0] = 0;

	// 0행 j열에 0을 채운다.
	for (int n = 0; n <= j; n++)
		table->Data[0][n] = 0;
	
	// 여긴 0, 0 부터 계산
	for (int m = 1; m <= i; m++)
	{
		for (int n = 1; n <= j; n++)
		{
			if (x[m - 1] != y[n - 1])
			{
				table->Data[m][n] = max(table->Data[m][n - 1], table->Data[m - 1][n]);
			}
			else
			{
				table->Data[m][n] = table->Data[m - 1][n - 1] + 1; 
			}
		}
	}

	return table->Data[i][j];

}

 

 

 초기 m = 0, n = 0 일 때 

0 G U T E N   M O R G E N .
G 0 0 0 0 0 0 0 0 0 0 0 0 0
O 0 0 0 0 0 0 0 0 0 0 0 0 0
O 0 0 0 0 0 0 0 0 0 0 0 0 0
D 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0
M 0 0 0 0 0 0 0 0 0 0 0 0 0
O 0 0 0 0 0 0 0 0 0 0 0 0 0
R 0 0 0 0 0 0 0 0 0 0 0 0 0
N 0 0 0 0 0 0 0 0 0 0 0 0 0
I 0 0 0 0 0 0 0 0 0 0 0 0 0
N 0 0 0 0 0 0 0 0 0 0 0 0 0
G 0 0 0 0 0 0 0 0 0 0 0 0 0
. 0 0 0 0 0 0 0 0 0 0 0 0 0

 

case 1

m = 1, n = 1 일 때, 

첫 문자 'G' 가 두 문자열 초기에 바로 등장하므로 table->Data[m][n]의 값을 1로 할당 

 

  G U T E N   M O R G E N .
G 0 0 0 0 0 0 0 0 0 0 0 0 0
O 0 1 0 0 0 0 0 0 0 0 0 0 0
O 0 0 0 0 0 0 0 0 0 0 0 0 0
D 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0
M 0 0 0 0 0 0 0 0 0 0 0 0 0
O 0 0 0 0 0 0 0 0 0 0 0 0 0
R 0 0 0 0 0 0 0 0 0 0 0 0 0
N 0 0 0 0 0 0 0 0 0 0 0 0 0
I 0 0 0 0 0 0 0 0 0 0 0 0 0
N 0 0 0 0 0 0 0 0 0 0 0 0 0
G 0 0 0 0 0 0 0 0 0 0 0 0 0
. 0 0 0 0 0 0 0 0 0 0 0 0 0

 

 

case 2

   이 후, n이 루프에 따라 n값이 증가하여 같은 문자를 발견할 때까지 반복한다. 그러나 같은 값은 9번 인덱스이다. 그 이전까진 다른 값이므로 max(table->Data[m][n-1] , table->Data[m-1][n]) 식에 따라 이전에 증가시킨 1을 계속 할당 

  G U T E N   M O R G E N .
G 0 0 0 0 0 0 0 0 0 0 0 0 0
O 0 1 1 1 1 1 1 1 1 0 0 0 0

 

 

case 3

같은 문자를 발견했으므로 (G) table->Data[m][n] = table->Data[m - 1][n - 1] + 1;  식을 사용 이전 값이 0이므로 1로 계산 한다. 

  G U T E N   M O R G E N .
G 0 0 0 0 0 0 0 0 0 0 0 0 0
O 0 1 1 1 1 1 1 1 1 1 0 0 0

 

 이후 값은 case2 와 같으므로 1로 채워진다. 이것을 계속 이전 값에 값을 더하고 그중 최대값을 가져오는 식으로 메모이제이션을 실행한다.

'알고리즘 풀이' 카테고리의 다른 글

2444번 별 찍기-7  (0) 2024.07.23
[백준] 킹, 퀸, 룩, 비숍, 나이트, 폰  (0) 2024.07.23
11403. 경로찾기  (0) 2024.04.16
10819. 차이를 최대로  (0) 2024.03.02
10974. 모든 순열  (0) 2024.03.01