codekata 5. prefix

rahula·2021년 6월 25일
0

algorithm

목록 보기
5/9

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

문제 파악

요구사항 : 여러 string들끼리 공통된 부분을 찾아라

제한사항 : 없음

인풋 : string이 담긴 list

아웃풋 : 하나의 string값.

본질 : string의 index 성질을 이용해서 서로 비교해라

생각하는 과정

  1. 반복문이 하나 필요하다. string끼리 비교해야 하기 때문.
  2. 공통되는 string값을 차곡차곡 넣을 변수가 필요하다.
  3. 생각해보니, 굳이 하나하나를 다 비교할 필요가 없다.
    애초에 다 반복문 돌릴 필요가 없고, 기존의 공통단어와 다른게 있는지에만 집중하면 된다. 'st'가 공통단어였다면, index를 2까지만 봐도 된다는거.
  4. 애초에 배열에서 가장 짧은 단어를 기준으로 잡아도 된다.

첫번째 방법

  1. 변수 : 우선 기준으로 잡을 string하나(common_str)가 필요하다.
  2. 반복문 : 해당 string을 제외한 리스트의 나머지 요소들에 대해서
  3. 반복문 : 그 안에서 common_str의 각 글자에 대해서
  4. 조건문 : 만약 비교하려는 요소의 길이 common_str의 길이보다 길다면, 다음 반복으로 넘어간다.
  5. 조건문 : 만약 해당 index의 글자가 common_str의 글자와 다르다면, common_str의 그 이전까지 슬라이싱한 값을 할당한다. 그리고 다음 반복으로 넘어간다.
  6. 반환 : common_str변수를 반환함으로써 함수실행을 종료한다.
def get_prefix(strs):
  if not strs:
    return ""
  common_str = strs[0]
  for string in strs[1:]:
    for i,s in enumerate(string):
      if i >= len(common_str):
        continue
      if s != common_str[i]:
        common_str = string[:i]
        continue

  return common_str

두번째 방법

짝꿍님이 생각하신 방법. 첫번째와 아이디어는 같았지만, 반복문을 실행하는 순서가 달랐다.

  1. 변수 선언 : 반복문을 실행할 기준을, 리스트의 첫번째 요소로.
  2. 변수 선언 : 결과값으로 만들 변수를 미리 빈 string값으로 선언
  3. 반복문 : common_str의 각 index, 알파벳에 대해서
  4. 반복문 : 리스트의 각 요소들에 대해서
  5. 조건문 : 만약 common_str과 같은 index의 글자가 common_str의 것과 다르다면, result를 return하고 함수 실행을 종료
  6. += : 위의 조건에 걸리지 않는다면, 글자를 변수에 합친다.
def get_prefix(strs):
  if not strs:
  	return ""
  common_str = min(strs, key=len)
  result = ""
  for i,c in enumerate(common_str):
    for string in strs:
      if string[i] != c:
        return result
    result += c
  return result

세번째 방법

동명(선생)님이 생각하신 방법.

  1. if else 변수 선언 : 만약 strs가 있다면 가장 작은 길이의 요소를, 아니면 빈 string값을 할당한다
  2. 반복문 : 최소길이단어를 기준으로
  3. 반복문 : 리스트의 각 요소에 대해서
  4. 조건문 : 같은 index의 값이 다를 경우 min_word의 index까지 잘라서 반환
def get_prefix(strs):
    min_word = min(strs, key=len) if strs else ''
    for i, c in enumerate(min_word):
        for word in strs:
            if word[i] != c:
                return min_word[:i]
    return min_word
profile
백엔드 지망 대학생

0개의 댓글