알고리즘(with TS)

알고리즘 풀이 3)4-5

2023. 1. 23. 20:16

Section3_4번: 가장 짧은 문자거리

-------강의 풀이------

목표 문자와의 양쪽 거리 확인하는 법

:앞에서부터 for문 돌면서 왼쪽과의 거리 체크

뒤에서부터 for문 돌면서 오른쪽과의 거리 체크.

둘 중 작은 값 가져오기.
*주의!!) 거리 체크용 변수의 초기값은=큰값(ex.문자열 길이보다 큰 1000)으로 설정해야한다. 

  맨 앞 문자 거리가 잘못 계산될 수 있음! ( ex. abcba 에서 c체크)

t e a c h e r m o d e
0 0 1 2 3 0 1 2 3 4 0 ->
1 0 3 2 1 0 4 3 2 1 0 <-
둘 중 작은 숫자로 재할당

function solution3_4(str: string, t: string): string {
  let answer:number[] = [];
  let cnt = 1000;
  for(let i=0; i<str.length; i++){
    if(str[i] !== t)cnt++;
    else cnt=0;
    answer.push(cnt) ;
  }

  cnt = 1000;
  for(let i=str.length-1; i>=0; i--){
    if(str[i] !== t){
      cnt++;
      answer[i] = Math.min(answer[i],cnt);
    }else {
      cnt=0;
    }
  }
  return answer.join(" ");
}
console.log(solution3_4("teachermode", "e"));

 

 

Section3_5번: 문자열 압축

function solution3_5(str: string): any {
  let answer =str[0];
  let count = 1;
  
  for (let i=1; i<str.length; i++){
    //앞에랑 같은 문자일때
    if(str[i]===str[i-1]){
      count ++;
    //앞에랑 다른 문자고 count 쌓여있을때
    }else if (count!==1 && str[i]!==str[i-1]) {
      answer += count.toString();
      answer += str[i];
      count =1; 
    // count도 1이고 다른문자일때
    }else answer += str[i];
  }
  return answer;
//----------강의 풀이-------------
  for (let i=1; i<str.length; i++){
    //앞에랑 같은 문자일때
    if(str[i]===str[i-1])count ++;
    //앞이랑 다른 문자일때
    else{
      answer += str[i];
      if(count!==1) answer += count.toString();
      count =1; 
    }  
  }
  return answer;
}
console.log(solution3_5("KKHSSSSSSSE"));

나는 i=1부터 시작, 강의 풀이는 문자열 맨 뒤에 빈문자 추가하고 length-1 미만까지 탐색