공통 문자가 포함된 문자열 추출

Steve·2021년 9월 19일
0

문제
strs은 단어가 담긴 배열입니다. 공통된 시작 단어(prefix)를 반환해주세요.

예를 들어 strs = ['start', 'stair', 'step'] return은 'st'

strs = ['start', 'wework', 'today'] return은 ''


const strs = ["start", "stair", "stap", "st"];

const getPrefix = (strs) => {
  let prefix = strs[0]; // 'start'

  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);
    }
  }

  return prefix;
};

// console.log("stair".indexOf("start"));
console.log(getPrefix(strs));

이번 코트카타를 하며 js 문법에 대해 다시한 번 복습해볼 수 있는 기회였다.

indexOf

console.log("stair".indexOf("start")); // -1
console.log("stair".indexOf("star")); //-1
console.log("stair".indexOf("sta")); // 0
console.log("stair".indexOf("st")); // 0
console.log("stair".indexOf("s")); // 0
: (값이 포함 돼있으면 0),

slice

: 배열과 문자열 모두 원하는 곳에서 끊어낼 때 사용.
[1,2,3,4].slice(1,3); // [2,3]
'abcd'.slice(1,3); // 'bc'

substring

: 문자열을 원하는 곳에서 끊어낼 때 사용.
'abcd'.slice(1,3); // 'bc'


위의 문법들을 제대로 파악을 못하고 있었기에 이번 문제는 혼자힘으로 해결하지 못했다.
특히 indexOf의 문법을 이번 기회에 잘 알고 넘어가야겠다.

풀이의 시작은 배열의 첫번째 요소를 비교대상으로 해서 나머지것들을 각각 비교하는 것이다.

for (let i = 1; i < strs.length; i++) {
    while (strs[i].indexOf(prefix) !== 0) {
      prefix = prefix.substring(0, prefix.length - 1);
    }
}

prefix는 배열의 첫번째 요소인 'start'로 시작을 해서
2번째 요소, 3번째 요소 ... 와 비교해나간다.
어짜피 하나의 요소라도 부합하지 않으면 안되기 때문에 간편하게 첫번째요소와 비교한다.
( 처음 고안해낸 것은 가작 적은 수의 글씨를 갖고 있는 갯수만큼 진행해야 한다고 생각했지만 indexOf를 제대로 파악하고 나니 그럴 필요가 없음을 확인했다)

strs[1]인 'stair'로 시작을 한다. 'stair'안에 'start'로 시작하는 문자열이 없다면 prefix의 글자를 하나씩 줄인다.
이제 prefix는 'star'이고 while문의 조건에 따라 'stair' 'star'로 시작하지 않기 때문에 또 글자를ㄹ 하나 줄인다.
이제 prefix는 'sta'이고 조건문에 해당되지 않기 때문에 ('stair'은 'sta'로 시작한다.) 배열의 다음 요소르 최신화된 prefix 'sta'와 비교를 해나간다.
'stap'은 'sta'로 시작하기 때문에 별다른 조치 없이 다음 요소인 'st'를 prefix 'sta'와 비교해나간다.
위와 같은 방법으로 진행시 prefix는 'st'로 최종 할당되고 return 된다.

profile
Front-Dev

0개의 댓글