본문 바로가기
2. 우당탕탕 개발자/2-1. 공부기록

2021.8.3 TIL 문자거리, 문자열 압축

by Little Monkey 2021. 8. 3.
반응형

가장 짧은 문자거리

주어진 단어를 하나씩 돌면서, 타겟한 문자와 최소 거리를 리턴

 

function solution(str, tar) {
  let answer;
  // code here;
  return answer;
}

let example = "happyecodinge";
let target = 'e';
console.log(solution(example, target))
//[5, 4, 3, 2, 1, 0, 1, 2, 3, 3, 2, 1, 0]

 

 

답) indexOf 를 이용하여 해당 문자의 앞뒤로 존재하는 타겟 문자와의 거리의 최소 값을 구한다.

 

function solution(str, tar) {
  let answer = [];
  let front = back = 0;

  for(let i = 0; i < str.length; i++) {
    front = str.indexOf(tar, front);
    back = str.indexOf(tar, front+1);

    let disFront = Math.abs(front - i);
    let disBack = Math.abs(back - i);

    if(disFront > disBack) {
      front = back;
      answer.push(disBack);
    } else {
      answer.push(disFront);
    }
  }

  return answer;
}

 

 

답2) 왼쪽으로 e의 거리를 측정하고, 다시 오른쪽으로 돌면서 e와의 거리를 측정하며 최소값만 취한다.

 

function solution(str, tar) {
  let answer = [];
  let index = Number.MAX_SAFE_INTEGER;

  //왼쪽으로 측정
  for(let i = 0; i < str.length; i++) {
    str[i] === tar ? index = 0: index++;
    answer.push(index);
  }

  index = Number.MAX_SAFE_INTEGER;

  //오른쪽으로 측정하며 e와의 거리 최소값만 취하기
  for(let i = str.length - 1; i > - 1; i--) {
    str[i] === tar ? index = 0: index++;
    answer[i] = Math.min(answer[i], index);
  }

  return answer;
}

 

 

문자열 압축 1

반복되는 문자열의 수를 문자 옆에 기록해준다. 1번만 반복되는 경우는 반복횟수를 기록하지 않는다.

 

function solution(str) {
  let answer;
  // code here;
  return answer;
}

let example = 'KKSSSKFFFKDDDDQD'; 
console.log(solution(example));//K4S3F3D5Q

 

 

답) split()을 이용하여 반복횟수를 알아낸다.

 

function solution(str) {
  let answer ='';
  let arr = [];

  for(let el of str) {
    if(!arr.includes(el)) {
      let index = str.split(el).length - 1;
      index === 1 ? arr.push(el) : arr.push(el, index);
    }
  }

  answer = arr.join('');
  return answer;
}

 

 

문자열 압축 2

연속하는 문자열의 압축. 문자열과 반복횟수를 기재하며 반복횟수가 1번일 경우 기재하지 않는다.

 

function solution(str) {
  let answer;
  // code here;
  return answer;
}

let example = 'KKHSSSSSSSE'; 
console.log(solution(example));//K2HS7E

 

 

답) 비교를 위해 마지막 문자에 빈 문자를 추가한다.

 

function solution(str) {
  let answer = '';
  let cnt = 1;
  let newStr = str+ ' '; //마지막 문자때문

  for(let i = 0; i < str.length; i++) {
    if(newStr[i] === newStr[i+1]) cnt++;
    else {
      answer += newStr[i] + (index === 1? '' : index);
      cnt = 1;
    }
  }

  return answer;
}
반응형

댓글