알고리즘 - 공통된 시작단어 찾기

인자로 들어가는 strs에는 몇 개의 문자열이 들어간 배열이 주어진다.
각 배열에 공통된 시작 단어를 반환하는 함수를 작성하기.

주어지는 배열에는 예를 들면 즉,

["qwerty", "qwertykeyboard", "qwertynickname"]

와 같은 배열이 주어진다면 여기서 qwerty를 뱉어내는 함수를 구현해야 한다.

처음에 든 생각은 먼저 배열 안에서 가장 긴 문자열을 찾은 다음(위 예시에서는 "qwertynickname"가 된다.) 각 배열을 나누어 또 하나의 배열로 만들어 , 각 배열의 첫번째 글자씩을 비교하여 가장 긴 문자열의 길이만큼 for문을 돌려서
같으면 새로운 빈 배열에 push를 하고 아니라면 거기서 끝내버리는 함수를 작성하면 되지 않을까 했었다.

하지만 for문 안에 또 for문을 쓰고, 또 그 안에 if문을 쓰기에는 코드가 너무 복잡해졌고, 또한 변수 i와 j가 내 뜻대로 통제되지 않아 처음 한번 두번을 돌면 아직 뒤에 글자가 남았음에도 비교가 되지 않는 상황에 빠졌다.

그렇게 머리 싸매다 어느 코드를 보았다.

const getPrefix = strs => {
    let init = strs[0];
  if(init){
  for (let i = 0; i < init.length; i++) {
    for (let z = 1; z < strs.length; z++) {
      while (strs[z].indexOf(init) === -1) {
          init= init.substring(0, init.length - 1);
        console.log(init)
      }
    }return  init
  }} return ""
}

먼저 배열의 첫 번째 요소를 변수로 지정한다(사실 가장 긴 문자열을 찾을 필요도 없었다. 가장 긴 문자열이라도 짧은 문자열에 그 글자가 없으면 말짱 도루묵이었기 때문에)

그 다음 if문을 걸어 init이 존재한다면(true가 될때 까지 계속 while문을 돌린다.)
문자열 배열의 z번째에 첫번째 배열의 글자 indexOf가 존재한다면,

init을 재할당하여 substring함수로 인해 맨 앞에서부터 init의 길이 앞까지 잘라서 return시킨다.

크롬 개발자도구 콘솔창에서 while문을 몇번 돌렸다가 켜 놓았던 여러 개의 창을 여러번 날려먹었던 기억때문에 while문은 쳐다도 보지 않았었는데(사실 조건을 걸지 않는다면 무한루프였기에 for문을 쓰면 되지 굳이 while문을 쓸 일이 있겠나 싶었다.)
while문을 이렇게도 활용할 수 있구나 다시 한번 배우게 되었다.

좋은 웹페이지 즐겨찾기