상권's

TIL 27 (2021.11.02) 본문

~2022 작성 글/TIL

TIL 27 (2021.11.02)

라마치 2021. 11. 2. 16:15
-오늘의 코플릿 2021.11.02-
문자열을 입력받아 다음의 조건을 만족하는 LPS*를 찾아 그 길이를 리턴해야 합니다.
LPS: 주어진 문자열의 가장 긴 접두어이자 접미어(Longest Prefix which is also Suffix)// non-overlapping: 접두어와 접미어는 서로 겹치는 부분이 없어야 합니다. 다시 말해, prefix와 suffix는 문자열의 동일한 인덱스에 위치한 문자를 요소로 가지면 안 됩니다.
output = LPS('aaaa');
console.log(output); // --> 2
// prefix: str.slice(0, 2)
// suffix: str.slice(2)
// non-overlapping 조건이 없는 경우 정답은 4 입니다.

output = LPS('aaaaa'); console.log(output); // --> 2
// prefix: str.slice(0, 2)
// suffix: str.slice(3)
// non-overlapping 조건이 없는 경우 정답은 5 입니다.
// 문자의 길이를 받아서
// 절반으로 나눈다 => 길이가 짝수면, 절반에 맞춰서 pre랑 suf랑 비교한다.
// 홀수면, 중간에 하나를 두고 나서 pre랑 fix를 확인한다.

첫 수도코드 => 처음에는 문제 자체를 이해를 못해서 접두어와 접미어를 찾아봤습니다. 입력되는 str에서 앞에서 시작하고, 뒤에서 시작했을 때 동일한 단어가 있다면 그 단어의 길이를 리턴하는 문제입니다. 그래서 절반을 나눠서 for문을 통해서 단어를 확인했을 때, 똑같은 부분이 있다면 n을 리턴하는 것으로 구현을 해봤습니다. 문제를 이해하는 데에 어려움이 있었지만 생각보다 금방 풀려서 놀랬습니다.

const LPS = function (str) {
  let half = parseInt(str.length / 2)
  let count = 0

    for ( let n = half; n >= 0; n-- ) {
      if( str.slice(0, n) === str.slice(-n) ) {
        return n
      }
    }

  return count
};

정규표현식을 이용할 경우, 아래와 같이 간단하게 코드를 구현할 수 있습니다. 

const LPS = (str) => {
  const result = str.match(/^(\w*).*\1$/);
  return result[1].length;
};

아직은 정규표현식이 어렵게 느껴지지만 추가적으로 학습해서 블로깅하도록 하겠습니다.

 

'~2022 작성 글 > TIL' 카테고리의 다른 글

TIL 29 (2021.11.04)  (0) 2021.11.04
TIL 28 (정적, 동적 웹사이트, useContext)(2021.11.03)  (0) 2021.11.03
TIL 26 (Redux) (2021.11.01)  (0) 2021.11.01
TIL 25 (2021.10.31)  (0) 2021.10.31
TIL 24 (클로저 함수)(2021.10.30)  (0) 2021.10.30
Comments