코드카타 prefix 찾기

그림자도서관·2020년 2월 16일

문제

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

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

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

고난의 시작

이거 푸느라 정신적인 데미지를 받았다.
다 풀수 있을것 같은데 미궁에 빠져서 헤어나오지 못한게 이틀.
급한 리액트도 제치고 본게 오늘 하루종일..
매번 for문을 돌릴때마다 반복되는 미궁에 오늘 이 미궁의 탈출구를 뚫어보려한다.

미궁의 시작

내가 미궁에 빠졌던 이유를 짚어보고 가자.
요소와 요소를 비교해서 최후의 공통 단어를 남겨놓는건 괜찮은 아이디어였지만
문제는 이중for문을 잘못된 방법으로 쓰면서 시작된다.
요소를 비교하기 위해
인덱스 [0] === [1], [1] === [2] 의 비교순차를 떠올린다.
이것은 끝없는 미궁의 진입로였던것 것이다.
이를 구현하려면

for(i=0; i<strs.length; i++){
	for(j=0; j<strs.length; j++{
		if(strs[i].split("")[j] ===  strs[i+1].split("").[j]){
        	arr.push(strs[i].split("")[j]);
        }
    }
}   

언뜻 보기에 좋은 출발점 같지만 이는 실은 엄청나게 복잡한 연산으로 가는 것이고,
결정적으로 마지막턴에서 strs[i+1] 즉 strs[3]과 같이 없는 요소를 가져오려고 하는 문제를 발생시킨다. 이걸 푸는 좋은 방법이 있는지는 모르겠지만 어쨋든 이걸 풀려고 하는건 좋은방법이 아닌것 같다. 길을 잘못 들어버린것이다!!

탈출구

이것이 탈출의 포인트다!
일단 아래는 문제의 정답부터!!

function findPrefix(strs){
    let prefix = strs[0];                                     //비교기준점 설정
    if(strs.length === 0){									 //빈배열을 위한 대비
        prefix = "";
    }
    for(let i=1; i<strs.length; i++){                        //for문
        while(strs[i].indexOf(prefix) !== 0){                // 이중for문하려고 했으나 여러번 반복해야 함으로 while
            prefix = prefix.substring(0, prefix.length-1)    // 프리픽스가 없거나, 단어 중간에 존재하면 단어를 뒤에서부터 하나씩 자른다;
        }
    }
    return prefix;
}

비교순차를 만드는 것은
[0] === [1], [1] === [2] 의 순차가 아니라
[0] === [0] , [0] === [1], [0] === [2] 의 순차가 되어야 한다.
그냥 직감적으로도 후자처럼 앞에 [0]이 고정되어 비교되는 넘버링이 늘어나는게 더 쉬운 순차로 보인다.
전자는 i와 i+1을 주어야 하기때문에 순차계산이 복잡해진다.
더군다나 마지막 턴에서 i+1의 없는 배열요소를 찾게 되는 문제가 발생한다.

상기 이유로 후자방식으로 순차를 주어야 한다.

0) 일단 요소 첫번째를 prefix로 지정하고(올바른 순차를 위한 바늘의 첫궤와 같은 작업),

프리픽스와 요소를 비교하여 프리픽스를 못찾으면,
즉 (range.indexOf.target !== 0)처럼 아예 없거나, 단어 맨앞이 아닌 중간에 존재한다면,
prefix에 할당된 단어를 뒤에서부터 하나씩 잘라버린다. 이것은 잘라버린 prefix가 비교단어의 프리픽스로서 일치할때까지 substring으로 뒷단어를 잘라버리는 것이다.

1) 아직 프리픽스가 나오지 않는 경우, while을 통해 단어의 꼬리를 계속 자르고
2) 마침내 프리픽스가 나오는 경우(range.indexOf.target === 0) return한다

맺으며, 핵심정리

알면 쉬운 로직이지만
모르고 익숙하지 않으면 나처럼 미궁에 빠져 몇일을 헤매는 문제다.
이 문제를 통해 내가 고쳐야 할점은
첫째는 턴을 돌리는 순차방식,
둘째는 턴을 돌리는 순차방식,
셋째도 턴을 돌리는 순차방식이다.

이중 for문이나 for+while 방식을 사용하려면
피라미드처럼 점에서 호로 분산되는 범위 계산을 해야 하는데
항상 이 점에 해당되는 시작점을 잘 주어야 한다.
이 시작점의 설정은 prefix = strs[0]와 같이 함수 시작과 함께 가장 첫줄에 지정하는 것이다.
이 시작점을 가지고 지지고 볶아야 턴을 돌아가며 원하는 결과를 추적해 나가기 수월해 진다.

profile
내 생에 단 한번

0개의 댓글