문제 링크
https://www.acmicpc.net/problem/17218
풀이
const [ first, second ] = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');
const dp = [...Array(first.length + 1)].map(() => Array(second.length + 1).fill(0));
for (let i = 1; i <= first.length; i++) {
for (let j = 1; j <= second.length; j++) {
if (first[i - 1] === second[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + 1;
} else {
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
}
}
}
const output = [];
let i = first.length;
let j = second.length;
const maxLen = dp[i][j];
while (output.length < maxLen) {
if (dp[i - 1][j] === dp[i][j]) {
i--;
} else if (dp[i][j - 1] === dp[i][j]) {
j--;
} else {
output.push(first[i - 1]);
i--;
j--;
}
}
console.log(output.reverse().join(''));
이 문제는 전형적인 최장 공통 부분 수열 문제다.
부분 수열의 길이가 아닌, 부분 수열 자체를 구하는 문제이므로,
dp 테이블을 다 채운 후에 가장 마지막 칸에서부터 역으로 거슬러 올라가야 한다.
이러한 최장 공통 부분 수열의 기본 개념에 대해서는 아래 링크를 참고하면 이해할 수 있을 것이다.
'연습장 > 백준(BOJ) 문제풀이' 카테고리의 다른 글
[백준 4948 - Node.js] 베르트랑 공준 (0) | 2022.03.31 |
---|---|
[백준 17219 - Node.js] 비밀번호 찾기 (0) | 2022.03.29 |
[백준 10994 - Node.js] 별 찍기 - 19 (0) | 2022.03.28 |
[백준 2748 - Node.js] 피보나치 수 2 (0) | 2022.03.19 |
[백준 3036 - Node.js] 링 (0) | 2022.02.13 |