HackerRank - Append and Delete

세나정·2023년 5월 17일
0

문제

풀이

맨 처음에 생각한 로직은 다음과 같다.

   // 공통적인 부분을 찾고 
   // 원래 값의 길이만큼에서 공통적인 애의 길이 만큼 빼준 후
   // 나온 숫자를 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가 두 배열의 길이의 합보다 월등히 클 때

profile
기록, 꺼내 쓸 수 있는 즐거움

0개의 댓글