공통된 시작 단어 반환

Jihyun-Jeon·2022년 6월 12일
0

strs은 단어가 담긴 배열입니다. 공통된 시작 단어(prefix)를 반환해주세요.
예를 들어 strs = ['start', 'stair', 'step'] return은 'st'
strs = ['start', 'wework', 'today'] return은 ''

🔶 내가 한 방법

방법1. 이중 for문을 도는 법 (직관적인 코드)

const getPrefix = (strs) => {
  // 1. strs의 요소가 없다면 ""바로 리턴.
  if (strs.length === 0) {
    return '';
  }

  // 2.strs배열 중 젤 첫번째 요소 기준으로 다른 요소와 비교한다.
  const word = strs[0];
  const unitArr = [];

  // 3. word의 각 인덱스에 해당하는 문자와, 다른 요소의 해당 인덱스의 문자가 같은지 비교한다.
  for (let i = 0; i < word.length; i += 1) {
    const unit = word[i]; //  s t a r t
    let tf = [];

  // 4. word의 문자와 같으면 true, 아니면 false를 반환하여 tf배열에 담는다.
    for (let j = 1; j < strs.length; j += 1) {
      // console.log(strs[j][i]); // s s t t a e i p r
      if (strs[j][i] === unit) {
        tf.push(true);
      } else {
        tf.push(false);
      }
    }

  // 5. 만약 tf에 false가 없으면 해당 unit을  unitArr에 담는다
    if (!tf.includes(false)) {
      unitArr.push(unit);
    } else {
      	break;
    }
    
  }

  // 6. unitArr에 있는 요소가 없다면 ""을 리턴.
  if (unitArr.length === 0) {
    return '';
  }
  
  // 6. unitArr에 있는 모든 요소를 더하여 리턴한다.
  return unitArr.join("");
};

// 실행코드
console.log(getPrefix(['start', 'stair', 'step'])); // 'st'
console.log(getPrefix(['start', 'wework', 'today'])); // ""
console.log(getPrefix(['abcff', 'drgff', 'uikff'])); // ""
console.log(getPrefix(['start', 'afair', 'step'])); // ''
console.log(getPrefix([])); // ''

방법2- 객체의 키값은 유니크한 속성을 활용

function getPrefix(strs) {
  // 1. strs의 길이가 0이라면 ""리턴
  if (strs.length < 1) {
    return '';
  }

  const match = []; // [s,t]

  // 2. strs의 첫 요소를 기준으로, 각 문자를 순회함.
  for (let i = 0; i < strs[0].length; i += 1) {
    // 3. 각 요소의 같은 인덱스를 순회하면서, 객체에 담는다.
    // 이때 객체의 키 값은 유니크하기 때문에 같은 문자라면 결국 키는 하나만 생성될 것임.
    const obj = strs.reduce((obj, word) => ({ ...obj, [word[i]]: 1 }), {});
    // console.log(obj); // {s:1} {t:1} {a: 1, e: 1}

    // 4. {a: 1, e: 1} 이면 모든 문자가 같지 않다는 것임.
    // 따라서 match에 푸쉬하지 않고 for문을 끝내버림.
    if (Object.keys(obj).length > 1) {
      break;
    }

    // 5. {s:1} {t:1} 이면 모든 문자가 같다는 것임.
    // 따라서 키값을 match 배열에 넣음
    match.push(Object.keys(obj)[0]);
  }

  // 6. match에 쌓인 모든 요소를 합하여 반환함.
  return match.join('');
}

🔶 다른 사람 방법

첫번째 단어를 뒤에서 짤라가는 법

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

  if (strs.length === 0) {
    prefix = '';
  }

  for (let i = 1; i < strs.length; i += 1) {
    while (strs[i].indexOf(prefix) !== 0) {
      prefix = prefix.substring(0, prefix.length - 1);
      // console.log('prefix:' + prefix); // star sta st
    }
  }

  return prefix;
};

0개의 댓글