본문 바로가기

Programming/데일리 알고리즘

[HackerRank] Special String Again (javascript)

총 3가지의 경우일 때 same character가 된다.

 

  1. 각각의 문자 1개 
  2. 문자의 갯수가 1이 아닌 홀수이고, 가운데 문자만 다를 때 
  3. 문자의 갯수가 짝수이고, 모두 같을 때 

 

function substrCount(n, s) {
  const array = s.split("");
  const stack = Array.from({ length: n }, () => 0); // 배열의 초기화시킨다. 

  // 1, 2번을 체크한다.
  let sum = 0;
  let i = 0;
  while (i < n) {
    const char = array[i];

    let count = 1;
    let j = i + 1;
    while (j < array.length && char === array[j]) {
      count++;
      j++;
    }
    stack[i] = count; // 배열에서 중복되는 문자의 갯수를 세어서 넣는다. 
    sum += parseInt(count * ((count + 1) / 2), 10); // 중복되는 문자로 만들 수 있는 경우의 수 
    i = j;
  }

  // 3번을 체크한다. 
  for (let i = 1; i < array.length; i++) {
    if (array[i] === array[i - 1]) {
      stack[i] = stack[i - 1];
    }
    if (array[i - 1] === array[i + 1] && array[i + 1] !== array[i]) {
      sum += Math.min(stack[i - 1], stack[i + 1]); // 양쪽 방향으로 문자의 중복 갯수가 최소인 것 
    }
  }

  return sum; 
}