TIL49. CodeKata : 공통된 시작 단어(prefix) 반환 문제

7664 단어 codekatacodekata

🌈 공통된 시작 단어(prefix) 반환 문제



🤔 나의 Solution

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

✔️ 예를 들어, "strs = ['start', 'stair', 'step']" 가 인자로 전달된다면, 함수안에서 'st'를 반환합니다. 3개의 요소가 'st'까지만 일치하기 때문이다.

✔️ "strs = ['start', 'wework', 'today']"가 전달된다면, ''를 반환합니다.

def get_prefix(strs):
  first_element = [x[0] for x in strs] # 👈 각 요소의 index 0번 알파벳 list
  if len(strs) == 0 or len(set(first_element)) >= 2:
    return ''
  i = 1 # 👈 1번 index부터 체크 시작
  while True:
    try:
      s_list = [x[i] for x in strs]
    except: # 👈 요소의 길이수가 맞지 않을 때 에러 처리
      break
    if len(set(s_list)) >= 2:  # 👈 set으로 캐스팅했을 때, 길이가 1보다 크다면 일치하지 않은 것.
      break
    i += 1
  return strs[0][:i]
strs = ['start', 'stair', 'step']  
print(get_prefix(strs))  

✔️ strs로 전달되는 원소들 중에 index 0번 값을 꺼내 이를 변수(first_element)에 보관한 뒤, str 자체가 빈 배열로 왔거나, 또는 변수(first_element)를 set으로 캐스팅햇을 때 요소가 2개 이상이라면 첫번째부터 요소들이 불일치하기 때문에 ''를 반환한다.

✔️ 만약 이 if문이 실행되지 않는다면, 아래 while문에서 str의 각 요소의 index 1번 문자를 체크하기 시작한다.

✔️ 만일 str의 요소들이 길이가 맞지 않다면, while문 실행 중 try문(리스트컴프리헨션)에서 에러가 발생하기 때문에 이를 예외처리 한다.

✔️ 에러가 발생하지 않았다면 s_list를 set으로 캐스팅해 2이상인지 확인한다. 2보다 크다면 중복되지 않은 알파벳이기 때문에 while문을 빠져나간다.


🤔 다른 해결 방법

def get_prefix(strs):
  if len(strs) == 0: # 👈 빈 배열일 때,
    return ''
  res = ''
  strs = sorted(strs) # 👈 print(strs) # ['stair', 'start', 'step']
  for i in strs[0]:
    if strs[-1].startswith(res+i):
      res += i
    else:
      break
  return res
strs = ['start', 'stair', 'step']  
print(get_prefix(strs))  

✔️ 정렬 함수를 활용해서 해결하는 방법은 위와 같다. 처음부터 빈배열이라면 ''을 반환한다.

✔️ 이후 배열을 정렬한다. 배열을 정렬하면, 알파벳 순서에 따라 우선 정렬된다. ['start', 'stair', 'step']이 전달됬다면, ['stair', 'start', 'step']을 반환한다.

✔️ 이럴 경우, strs의 첫번째 요소의 i번째 값이 마지막 요소의 res+i로 시작되는지 확인하면된다. startwith함수는 parameter로 전달된 값으로 시작되는지 여부에 따라 True, False를 반환한다. 이 반대는 endswith 함수가 있다.

✔️ 이에 True값이라면, 일치하기 때문에 res에 현재 i값을 계속 붙여준다.

✔️ False 값이라면 break하기 때문에 그 이전까지의 res값이 공통된 시작 단어이다.


🤔 느낀점.

1. startswith과 endswith 함수를 처음 봤다. 시작 또는 끝에 목표 데이터를 가지고 있는지 확인할 때 꼭 사용해보자.

2. 리스트 내 요소의 길이가 모두 다를 때, 공통되는 index길이까지 확인해야한다면 try..except을 사용하자.

3. 정렬 시, 맨 앞의 단어와 맨 뒤에 단어만 비교하면 사이에 있는 요소를 검증할 필요가 없는 것을 떠올리자.

좋은 웹페이지 즐겨찾기