WeCode Kata Day 5

luneah·2021년 12월 3일
0

WeCode Kata

목록 보기
5/20
post-thumbnail

문제

strs은 단어가 담긴 배열이다. 공통된 시작 단어(prefix)를 반환하라.

Ex)
strs = ['start', 'stair', 'step'] return'st'
strs = ['start', 'wework', 'today'] return''

Thinking Algorithm

  1. 다른 문자열과 비교할 대상 선정 (prefix = ‘start’)
  2. strs에 아무것도 없을 경우 빈 문자열 반환
  3. 반복문은 1부터 시작해서 1씩 증가하는데 strs의 길이만큼 반복
  4. strs[i]번째에 prefix가 있으면 0이 나올 것이고 없으면 -1이 나옴
    ㄴ while문이 0이 나오면 종료하고 -1이나오면 계속해서 반복
  5. prefix의 길이가 줄어들면서 indexOf가 0이 될 때까지 strs의 인덱스에 포함되어지는 문자열로 점점 줄어들면서 비교

Code

const getPrefix = strs => {
  let prefix = strs[0];    
    if(strs.length === 0){	 
        prefix = "";
    }
    for(let i=1; i<strs.length; i++){            
        while(strs[i].indexOf(prefix) !== 0){               
            prefix = prefix.substring(0, prefix.length-1)
            console.log('prefix:' + prefix)
        }
    }
    return prefix;
}

💬   substring 과 slice 는 비슷한 기능을 해준다! (단, substring 과는 달리 slice 는 배열에서도 사용 가능)

다른 풀이 방법

  1. strs가 빈 문자열일 때 공백 반환
  2. 다른 단어와 비교할 대상 선정
  3. 2에서 선정한 단어를 split을 사용해 글자 단위로 나눠줌
  4. 기준이 되는 인덱스를 0으로 설정하고 멈춰주는 기능을 하는 stop의 기본값을 false로 설정함
  5. 이중 for문을 사용해 prefix의 글자 하나하나와 strs의 단어 하나하나를 비교해줌
    ㄴ 비교했을 때 같지 않으면 인덱스가 -1이 되고 반복문 실행을 멈춤, 같으면 다음 글자와 비교해줌
  6. 글자 단위로 나눠져있는 prefix를 slice로 해당 범위까지 잘라준 다음 합쳐서 반환함
const getPrefix = strs => {
  if (strs.length === 0) {
    return '';
  }

  let prefix = strs[0]
  let preSplit = prefix.split('');
  let idx = 0;
  let stop = false;
  
  for (let i = 0; i < preSplit.length; i++) {
      let char = preSplit[i]; // [s, t, a, r, t]
      
      for (let j = 0; j < strs.length; j++) {
          let thisPreSplit = strs[j].split(''); // [start, stair, step]
          
          if (char !== thisPreSplit[i]) {
              idx = i-1;
              stop = true;
              break;
          }
      }     
      if (stop) break;
  }
  if (!stop) {
      idx = preSplit.length - 1;
  }
  
  return preSplit.slice(0, idx+1).join('');
}

❗️항상 배열이나 문자열이나 비어있는 경우를 잘 따져서 식 작성할 것!

profile
하늘이의 개발 일기

0개의 댓글