Algorithm - CodeKata #05

devmoonsh·2020년 9월 6일
0

Algorithm

목록 보기
20/37
post-thumbnail

1. Question

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

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

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

2. Try & Answer

문제는 참 간단해 보이는데 너무 어려웠다.....

이번에도 역시 구글링으로...

function getPrefix(strs) {
    if(!strs.length) {
        return "";
    }
    let sorted = strs.sort();
    let string1 = sorted[0];
    let string2 = sorted[sorted.length-1];
    let i = 0;
    let l = Math.min(string1.length, string2.length);
    
    while(i < l && string1[i] === string2[i]) {
        i++;
    }
    return string1.slice(0, i);
}
    
console.log(getPrefix(['step', 'start', 'stair'])); // 'st'
console.log(getPrefix(['start', 'stair', 'apple'])); // ''
console.log(getPrefix([])); // ''

천천히 이해 중심으로 글을 작성해 보겠다.

함수 안에서

  1. 만약 strs가 빈 배열이라면 ""을 출력한다.

  2. sorted라는 변수에 strs 배열을 sort() 메서드를 사용하여 정렬한 뒤 저장한다.

    • ex) 만약 strs 배열이 ['step', 'start', 'stair'] 라면, [ 'stair', 'start', 'step' ]로 정렬된다. (알파벳 순)
  3. string1 이라는 변수에 sorted 배열의 첫 번 째 요소를 담아 저장한다.

  4. string2 라는 변수에 sorted 배열의 마지막 요소를 담아 저장한다.

    • 이렇게 두 개의 변수만 저장하는 이유는 위에서 sort() 메서드를 사용하여 정렬해주었기 때문이다.

    • ex) strs가 [ 'stair', 'start', 'step' ]로 정렬되었다면 배열의 가운데 요소는 비교에서 생략해도 되므로 첫번째 요소와 마지막 요소만 따오는 것이다.

  5. i = 0 이라는 변수를 설정한다.

  6. l이라는 변수를 선언하고 그 값은 string1과 string2를 비교하여 문자의 길이가 더 짧은 것의 숫자로 저장한다.

    • 만약 stair과 step을 비교한다면 start의 길이는 5, step의 길이는 4이다. 따라서 둘 중 더 작은 길이인 4번째 문자까지만 비교하면 되므로 최소값 설정이 필요한 것이다.
  7. while 문의 조건 = i < l && string1[i] === string2[i] 이 참일 때까지 i 값을 1씩 더해나간다.

    • 여기서 조건을 해석해 보면, l은 6번에서 설정한 값이며, i < l 조건을 만족하고 동시에 string1과 string2 각 문자열의 자리수의 값이 서로 동일할 때 까지만 i 값을 증가시키는 반복을 실행하겠다는 것이다.
  8. 반복문이 끝나면 string1 문자열에서 slice() 메서드를 사용하여 0번 째 문자부터 i번 째 문자까지 출력한다.


Ref.

profile
Junior front-end developer

0개의 댓글