Algorithm / Code Kata / W1D5 공통된 시작 글자 구하기
strs
은 단어가 담긴 배열입니다. 공통된 시작 단어(prefix)를 반환해주세요.
예를 들어 strs = ['start', 'stair', 'step']
의 return
은 'st'
이고 strs = ['start', 'wework', 'today']
의 return
은 ''
이다.
Code
const getPrefix = (strs) => {
const arr = [];
const prefix = strs[0];
if (prefix === undefined) return "";
for (let i = 1; i < strs.length; i++) {
for (let j = 0; j < prefix.length; j++) {
if (prefix[j] === strs[i][j] && prefix[j + 1] === undefined) {
arr.push(j + 1);
break;
} else if (prefix[j] !== strs[i][j]) {
arr.push(j);
break;
}
}
}
return prefix.slice(0, Math.min(...arr));
};
대략적인 흐름은 prefix
에 인자에 들어올 배열의 가장 처음 단어로 설정하고 이를 남은 배열의 요소들과 글자까지 비교한다. 이후 공통되지 않은 글자가 시작하는 인덱스를 arr
에 저장한다. arr
에서 최소값을 구해 prefix
에서 앞에서부터 잘라 공통 글자들을 구한다.
테스트를 위해 사용한 배열들
let strs1 = ['preorder', 'prefix'];
let strs2 = ['rewrite', 'reset', 'redo', 'restart'];
let strs3 = ['extracurricular', 'extraservice', 'extraordinary', 'extramood'];
let strs4 = [];
let strs5 = ['coexist', 'decode', 'infield'];
let strs6 = ['mistake', 'misunderstand', 'misfire'];
배열 양끝에 한 글자로 시작하는 공통된 글자를 가진 배열, 빈 배열 등등 다양한 상황을 상정하여 만들었다.
눈이 편안한 코드 리뷰
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)
}
}
return prefix;
}
while
, indexOf
그리고 substring