BOJ 9252 (LCS 2)
ย - Last update: 2023-06-02

LCS๋Š” Longest Common Subsequence์˜ ์•ฝ์ž๋กœ ์ด ๋ฌธ์ œ ์ œ๋ชฉ์—๋„ ๋Œ€๋†“๊ณ  ์“ฐ์˜€๋‹ค. ์ฒ˜์Œ ์ ‘ํ–ˆ์„ ๋•Œ ์ƒ๊ฐํ•˜๊ธฐ ์–ด๋ ค์šด DP์ด๊ณ , ๊ฐœ๊ฐ™์ด ๋ฉธ๋ง. ์•„๋ž˜ URL์˜ ํ’€์ด๋ฅผ ๊ฑฐ์˜ ๊ทธ๋Œ€๋กœ ์ฐธ๊ณ ํ–ˆ๋‹ค.

ํ•ด๋‹น ๊ธ€์—์„œ ์„ค๋ช… ๋ฐฉ๋ฒ•์ด ์•„์ฃผ ์ข‹์€๋ฐ, ์šฐ์„  Longest Common String(Substring?)์„ ๋จผ์ € ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž. "์—ฐ์†๋œ๋‹ค"๋Š” ์กฐ๊ฑด ๋•Œ๋ฌธ์— ์ด ๊ฒฝ์šฐ ์ „์ฒด ๋ชจ์–‘์ด ์•„๋ž˜์ฒ˜๋Ÿผ ๋œ๋‹ค.

for() {
for() {
if (A[a] == B[b]) DP[i][j] = DP[i-1][j-1] + 1;
else DP[i][j] = 0;
}
}

์‚ฌ์‹ค ๋ชจ์–‘์„ ๋ณด๋ฉด ์•Œ๊ฒ ์ง€๋งŒ ๊ตณ์ด 2์ฐจ์› DP ๋ฐฐ์—ด์„ ์“ธ ํ•„์š”๋„ ์—†๋‹ค. ๋ฐฐ์—ด์—์„œ์˜ ๊ฒฐ๊ณผ๋Š” ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ๋งŒ ์กด์žฌํ•œ๋‹ค. ์ค‘๊ฐ„์— ์„œ๋กœ ๋‹ค๋ฅธ ๋ฌธ์ž์—ด์ด ๋‚˜์˜ค์ž๋งˆ์ž ์นผ๊ฐ™์ด 0์œผ๋กœ ๋งŒ๋“ค์–ด ์ฃผ๋Š” ๊ฒƒ์ด ํฌ์ธํŠธ์ด๋‹ค.

์—ฌ๊ธฐ์„œ ์‚ฌ๊ณ ๋ฅผ ํ™•์žฅํ•ด๋ณด์ž. 0์œผ๋กœ ๋งŒ๋“œ๋Š” ์ด์œ ๋Š” ์—ฐ์†๋œ๋‹ค๋Š” ์กฐ๊ฑด์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์—ฐ์†๋œ๋‹ค๋Š” ์กฐ๊ฑด์ด ์—†์„ ๋•Œ๋Š” ์–ด๋–ป๊ฒŒ ๋  ๊ฒƒ์ธ๊ฐ€? ์ด ๊ฒฝ์šฐ ํ˜„์žฌ๊นŒ์ง€์˜ ์ตœ๋Œ€ ๊ณตํ†ต ๋ถ€๋ถ„ ๊ธธ์ด๊ฐ€ ์œ ์ง€๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ์œ ์ง€๋Š” x์ถ•์œผ๋กœ ํ•ด์•ผํ•  ์ˆ˜๋„ ์žˆ๊ณ , y์ถ•์œผ๋กœ ํ•ด์•ผํ•  ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— x, y์ถ•์— ๋Œ€ํ•œ max ๊ฐ’์„ ๊ตฌํ•ด์ฃผ๋ฉด ๋˜๊ฒ ๋‹ค. ๊ทธ๋ž˜์„œ ์œ„ DP ์‹์ด ์•„์ฃผ ์•ฝ๊ฐ„ ๋ฐ”๋€๋‹ค.

for() {
for() {
if (A[a] == B[b]) DP[i][j] = DP[i-1][j-1] + 1;
else DP[i][j] = max(DP[i-1][j], DP[i][j-1]);
}
}

๊ทธ๋ฆฌ๊ณ , ์ด๋Ÿฌํ•œ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” LCS๋ฅผ ํ•˜๋‚˜ ์ถœ๋ ฅํ•˜๋ผ๊ณ  ํ•˜๋ฉด, ๊ทธ๊ฒƒ์€ DP ๋ฐฐ์—ด์„ ํ™œ์šฉํ•ด์„œ ๋Œ€๊ฐ ๋ฐฉํ–ฅ์œผ๋กœ ์ˆซ์ž๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š” path๋ฅผ ์ž˜ ๋”ฐ๋ผ๊ฐ€๋ฉด ๋œ๋‹ค. ๊ฒฐ๊ณผ๋Š” ์—ญ๋ฐฉํ–ฅ์œผ๋กœ ์ถœ๋ ฅํ•˜๋ฉด ๋œ๋‹ค.

vector<char> word;
int ap = alen, bp = blen;
while(ap != 0 && bp != 0) {
if (DP[bp][ap] == DP[bp][ap-1]) {
ap--;
continue;
}
if (DP[bp][ap] == DP[bp-1][ap]) {
bp--;
continue;
}
word.push_back(A[ap]);
ap--;
bp--;
}
if (word.size()) {
for(auto it = word.rbegin(); it != word.rend(); ++it){
printf("%c", *it);
}
printf("\n");
}

์˜ค๋Š˜๋„ DP์— 1ํŒจ๋ฅผ ํ–ˆ๋‹ค. ์œผ์•…!

๐Ÿท๏ธ ์ฃผ์ œ ๋ชฉ๋ก: