🔗 문제 LINK

♟ 풀이 순서

answer = 문자열 압축 후 문자열의 길이들 배열에 넣어둠
str = 압축한 문자열
count = 2 (연속된문자의 수, 2가 기본값)
arr = 단위k개로 쪼갠 배열

  1. 단위k개로 쪼개서 배열로 생성
  2. k개단위로 잘라 압축한 문자열 str의 길이를 answer에 push

    • 현위치 가운데로 기준으로 앞뒤 비교하며 압축
    • [이전index, 현위치, 다음index]
    • [b, b, b] 일 경우 count ++
    • [b, b, c] 일 경우 str = str + count + b, count 리셋
    • [a, b, b] 일 경우 x
    • [a, b, c] 일 경우 str = str + b
    • str의 길이를 answer배열에 push
  3. 1,2번의 k를 (최소 1 ~ 최대(문자길이)/2)로 대입해서 계산
  4. answer에서 가장 작은 수 return

🚨 주의

  • 배열이 1개일 경우
  • 압축길이가 2자리를 넘어갈 수 있음

👾 코드

const solution = (s) => {
  const answer = [];
  // 3. 1,2번의 k를 (최소 1 ~ 최대(문자길이)/2)로 대입해서 계산
  for (let k = 1; k <= Math.ceil(s.length / 2); k++) {
    let str = "";
    let count = 2;
    // 1. 단위k개로 쪼개서 배열로 생성
    const arr = s.match(new RegExp(".{1," + k + "}", "g"));
    // 2. k개단위로 잘라 압축한 문자열 str의 길이를 answer에 push
    for (let i = 0; i < arr.length; i++) {
      if (arr[i - 1] === arr[i] && arr[i] == arr[i + 1]) count++;
      if (arr[i - 1] == arr[i] && arr[i] !== arr[i + 1]) {
        str = str + count + arr[i];
        count = 2;
      }
      if (arr[i - 1] !== arr[i] && arr[i] !== arr[i + 1]) str = str + arr[i];
    }
    answer.push(str.length);
  }
  // 4. answer에서 가장 작은 수 return
  return Math.min(...answer);
};

❓ 질문

  • count를 2로 시작한 이유?
    기본적으로 앞에 숫자는 2이상일때만 붙는다. 만약 기본값을 0이나 1로 주었다면 첫문자 시작때, [a, b, b] 일때도 1을 더해주어야 한다. 그렇게되면 2줄이 더 추가되므로 그냥 기본값을 2로 시작하였다.
  • 최대반복을 k <= Math.round(s.length / 2)로 한 이유
    반복이 있으려면 최소 2개의 배열이 있어야 하므로 최대 길이의 반까지만 나누도록 하였다. 내림을 하지 않고 반올림을 한 이유는 s.length가 1일경우 내림을 하니 0이되서 글자가 1개일때는 for문을 돌지 않았다.

☕ 잡담

  • 다른 사람들 풀이는 그냥 읽어보기만 하고 말았는데 이번에 한번 제출해서 연산 속도를 봤다. 기본적인if와 for문만 쓴 코드가 내 코드보다 10배가량 더 빠른걸 보고 충격이였다. 그동안 시간은 pass안될때만 신경썼는데 이렇게까지 많이 차이가 날 줄은 몰랐다.
  • 처음에 풀때 앞에서부터 압축 문자열을 만들지 않고 글자의 길이만 반환 해주려고 했다. 앞에서 부터 읽어들이면서 바로 이전과 다른 문자일 경우 쪼갠 단위를 더해주고, 이후 같을 경우 1번만 문자열 길이+1 해주는 식으로 그런데 다 하고 나니 문자열일 10회이상 반복될 경우를 고려해주지 않았다는걸 알았다. 지금 그 코드에서 변경을 할까 이런 방식을 택한 이유가 메모리를 많이 안쓰려고 그렇게 할까 한거 였는데 10회 반복일 경우를 고려 해주기 위해서는 count해주는 변수가 필요할 것 같았다. 그리고 이 방식으로 하면 중간에 압축해준 결과를 볼 수 없어서 로직상의 문제가 있어도 바로 파악하기가 힘들었다. 그래서 방식을 바꿔서 압축문자열을 만들고 그 길이를 읽는 식으로 했다. 이렇게 하니 중간에 콘솔을 넣어서 과정 중에 예외처리까먹은 것이 있어도 찾기가 쉬웠다.





Leave a comment