[Codekata] Week1 - Day5

Jungmin Seo·2021년 7월 4일
0

Codekata

목록 보기
5/10

문제

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

strs = ['start', 'stair', 'step']
return은 'st'
strs = ['start', 'wework', 'today']
return은 ''

풀이

#1 나의 풀이

이렇게 풀면 안된다 !!!!!!
이미 앞에서 prefix가 끝나서 그 이후로는 돌릴 필요가 없는데, 끝까지 다 돌리는 방법.

 def get_prefix(strs):
   result = ''
   result_pre = ''
   # input 값이 비어있을 경우, 빈 result 반환
   if len(strs) == 0:
     return result
     
   # 첫번째 str 기준으로  
   for i in strs[0]:
     result_pre = i
     for word in strs[1:]:
       if word.startswith(result+result_pre):
         continue
       else:
         result_pre = ''
     
     result = result + result_pre
   return result

#2 set()를 이용한 방법

strs의 각 i[0] 꺼내서 set로 넣고, set 길이 1 이면 해당 i를 result에 넣기

def get_prefix(strs):
    list_strs = []
    result = ''
    
    # input 값이 비어있을 경우, 빈 result 반환
    if len(strs) == 0:
      return ''
      
    # 가장 짧은 str의 길이까지만 돌리기  
    index = len(min(strs))
    for i in range(index):
      for str in strs:
        list_strs.append(str[i])
        
      # set() == 1인 경우, 즉 리스트에 들어온 모든 character가 같을 때
      if len(set(list_strs)) == 1:
        result = result + str[i]
        list_strs = []
      else:
        return result

    return result

#3 sort()를 이용한 방법

가장 간단하고 빠른 방법이지만,
sort()를 이용하여 첫번째와 마지막 요소만 비교한다는, 이 로직을 생각해내기가 어려웠다.

def get_prefix(strs):
  result = ''
  
  # input 값이 비어있을 경우, 빈 result 반환
  if len(strs) == 0:
    return result
    
  # abc 순으로 리스트 내 요소들을 정렬
  strs.sort()
  # 첫번째와 마지막 요소만 비교한다
  first, last = strs[0], strs[-1]
  
  # 둘 중 더 짧은 요소의 길이만큼만 돌린다
  for i in range(len(min(first, last))):
    if first[i] == last[i]:
      result += first[i]
    else:
      break

  return result
profile
Hello World!

0개의 댓글