Algorithm/๋ฌธ์ œํ’€์ด

[๋ฐฑ์ค€] 9251๋ฒˆ - LCS (C++)

moaoh 2023. 8. 9. 22:04

 

9251๋ฒˆ: LCS

LCS(Longest Common Subsequence, ์ตœ์žฅ ๊ณตํ†ต ๋ถ€๋ถ„ ์ˆ˜์—ด)๋ฌธ์ œ๋Š” ๋‘ ์ˆ˜์—ด์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋ชจ๋‘์˜ ๋ถ€๋ถ„ ์ˆ˜์—ด์ด ๋˜๋Š” ์ˆ˜์—ด ์ค‘ ๊ฐ€์žฅ ๊ธด ๊ฒƒ์„ ์ฐพ๋Š” ๋ฌธ์ œ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ACAYKP์™€ CAPCAK์˜ LCS๋Š” ACAK๊ฐ€ ๋œ๋‹ค.

www.acmicpc.net

๋ฌธ์ œ

LCS(Longest Common Subsequence, ์ตœ์žฅ ๊ณตํ†ต ๋ถ€๋ถ„ ์ˆ˜์—ด)๋ฌธ์ œ๋Š” ๋‘ ์ˆ˜์—ด์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋ชจ๋‘์˜ ๋ถ€๋ถ„ ์ˆ˜์—ด์ด ๋˜๋Š” ์ˆ˜์—ด ์ค‘ ๊ฐ€์žฅ ๊ธด ๊ฒƒ์„ ์ฐพ๋Š” ๋ฌธ์ œ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ACAYKP์™€ CAPCAK์˜ LCS๋Š” ACAK๊ฐ€ ๋œ๋‹ค.

 

์ž…๋ ฅ

์ฒซ์งธ ์ค„๊ณผ ๋‘˜์งธ ์ค„์— ๋‘ ๋ฌธ์ž์—ด์ด ์ฃผ์–ด์ง„๋‹ค. ๋ฌธ์ž์—ด์€ ์•ŒํŒŒ๋ฒณ ๋Œ€๋ฌธ์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ, ์ตœ๋Œ€ 1000๊ธ€์ž๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

 

 

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„ ๋‘ ๋ฌธ์ž์—ด์˜ LCS์˜ ๊ธธ์ด๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

ํ’€์ด๊ณผ์ •

์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ์— ๊ฒฝ์šฐ์—๋Š” LCS(Longest Common Subsequence, ์ตœ์žฅ ๊ณตํ†ต ๋ถ€๋ถ„ ์ˆ˜์—ด) ๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐœ๋…์„ ์•Œ๊ณ 
๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ ์ ‘๊ทผ์„ ํ•ด์•ผ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์˜€์—ˆ๋‹ค.

 

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ๊ทธ๋ฆผ์œผ๋กœ ์•Œ์•„๋ณด๋Š” LCS ์•Œ๊ณ ๋ฆฌ์ฆ˜ - Longest Common Substring์™€ Longest Common Subsequence

LCS๋Š” ์ฃผ๋กœ ์ตœ์žฅ ๊ณตํ†ต ๋ถ€๋ถ„์ˆ˜์—ด(Longest Common Subsequence)์„ ๋งํ•ฉ๋‹ˆ๋‹ค๋งŒ, ์ตœ์žฅ ๊ณตํ†ต ๋ฌธ์ž์—ด(Longest Common Substring)์„ ๋งํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

velog.io

๊ทธ๋ž˜์„œ ์œ„์™€ ๊ฐ™์€ ๊ธ€์„ ์ฐธ๊ณ ํ•˜์—ฌ ๋ฌธ์ œํ’€์ด๋ฅผ ์ง„ํ–‰ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

LCS ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ธฐ๋ณธ ๊ฐœ๋…์€ 

if ( a[i] == b[i] )
	alpha[i][j] = alpha[i-1][j-1] + 1;
else
	alpha[i][j] = std::max(alpha[i - 1][j], alpha[i][j - 1]);

์œ„์™€ ๊ฐ™์€ ์‹์œผ๋กœ ์ง„ํ–‰์ด๋œ๋‹ค.

  1. a์™€ b์˜ ์•ŒํŒŒ๋ฒณ์„ ์„œ๋กœ ๋น„๊ตํ•œ๋‹ค.
  2. ๋น„๊ตํ•œ ๊ฐ’์ด ์„œ๋กœ ๊ฐ™๋‹ค๋ฉด ํ•ด์˜จ ๊ณผ์ •์ค‘์— ๊ฐ€์žฅ ํฐ ๊ฐ’์— + 1 ํ•ด์ค€๋‹ค.
  3. ๋น„๊ตํ•œ ๊ฐ’์ด ์„œ๋กœ ๋‹ค๋ฅด๋‹ค๋ฉด ๋‹ค๋ฅธ ๋Œ€์กฐ๊ตฐ ์ค‘ ๊ฐ€์žฅ ํฐ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค.

์œ„์™€ ๊ฐ™์€ ์‹์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€์ด๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋ฉด LSC ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ˜•์‹์ด ๋œ๋‹ค๊ณ  ์ƒ๊ฐ์„ํ•˜๋ฉด ๋œ๋‹ค. ( ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์œ„์— ๋งํฌ ํ™•์ธ )

code

#include <iostream>
#include <algorithm>
#include <string>

int		alpha[1001][1001];

int		main(void)
{
	std::string	a, b;
	int		aLen = 0, bLen = 0;

	std::cin >> a >> b;
	aLen = a.length();
	bLen = b.length();
	for (int i = 1; i <= aLen; i++) {
		for (int j = 1; j <= bLen; j++) {
			if (a[i - 1] == b[j - 1])
				alpha[i][j] = alpha[i - 1][j - 1] + 1;
			else
				alpha[i][j] = std::max(alpha[i - 1][j], alpha[i][j - 1]);
		}
	}
	std::cout << alpha[aLen][bLen];

	return (0);
}

 

ํ›„๊ธฐ

dp๋Š” ํ’€์–ด๋„ ํ’€์–ด๋„ ์–ด๋ ต๋‹ค๋Š” ์ƒ๊ฐ์ด ์ž๊พธ ๋“ ๋‹ค.

๋ณผ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กญ๊ณ  ์งœ๋ฆฟํ•˜๋‹ค.

๋Œ“๊ธ€์ˆ˜0