맨 처음에 생각한 로직은 다음과 같다.
// 공통적인 부분을 찾고
// 원래 값의 길이만큼에서 공통적인 애의 길이 만큼 빼준 후
// 나온 숫자를 k에서 빼줌
// 그리고 만들려는 숫자가 남은 k와 같다면 yes
function appendAndDelete(s, t, k) {
const commonLen = findCommonPrefixLength(s, t);
// 최소 작업횟수 : 두 배열의 길이의 합 - 공통된 부분의 2배 -> 서로 다른 것들의 길이만 나옴
// 공통된 것들을 빼고 남은 것들의 총 길이
const minOperations = s.length + t.length - ( 2 * commonLen );
// 작업의 길이가 최소 작업횟수의 길이보다 크고, 작업의 길이, 최소 작업횟수의 길이 모두가 짝수거나 홀수이거나
// k가 두 개의 합한 길이보다 길 때 (작업해야하는 것에 둘의 길이가 짧을 때 - aba 경우)
// 짝수 홀수로 비교하는 이유는 같은 짝수, 홀수여야 작업 횟수를 통해 길이차이를 0으로 만들 수 있어서
// return yes
if ((k >= minOperations && k % 2 === minOperations % 2) || k >= s.length + t.length) {
return "Yes";
} else {
return "No";
}
function findCommonPrefixLength(s, t) {
// 같은 것을 셀 길이
let commonLen = 0;
// 두 배열 중 작은 것의 길이
const minLen = Math.min(s.length, t.length);
// 같을 때까지 길이를 늘리다가 아닐시 바로 breack
for (let i = 0; i < minLen; i++) {
if (s[i] === t[i]) {
commonLen++;
} else {
break;
}
}
return commonLen;
}
}
공통되는 길이를 구한 다음,
주어진 두 배열의 길이를 합한 후 2배의 공통길이를 빼 작업을 해야하는 길이를 구한다.
그 후,
1. 주어진 작업 가능 횟수가 우리가 작업해야하는 최소 횟수보다 크거나 같고 둘 모두가 같은 짝수나 홀수일 때 -> 작은 짝수나 홀수여야 작업 횟수를 조절하여 원래 값으로 지정 가능
2. k가 두 배열의 길이의 합보다 월등히 클 때