[python 기초] code-kata week1-5

8397 단어 BackendpythonBackend

🖥 Code-kata week1-4


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

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


풀이
내가 처음에 접근한 방식은 set 자료형을 활용하는 것이었다.
list를 set으로 바꾸면 중복값이 제거된다는 점을 활용해,
각 단어 별 문자를 list로 묶고 set으로 바꿨을 때 길이가 1이면
-> 모두 같은 문자라는 뜻이다.

strs = ['start','stair','step']

def get_prefix(strs):
  result = ''
  min_length = min([len(str) for str in strs])

  #for문을 통해 아래와 같이 new_lst를 만들고, 비교가 끝난 후에는 slicing을 통해 첫 문자를 삭제한다. 
  new_lst = [strs[0][0], strs[1][0], strs[2][0]]
  strs[i] = strs[1:]	#['tart','tair','tep']
  new_lst = [strs[0][0], strs[1][0], strs[2][0]]
  strs[i] = strs[1:]	#['art','air','ep']
  ...
  ...

  while min_length != 0: 
      if set(new_lst) == 1:
          #return값에 저장하고 다음 문자로 넘어간다
          ...

그런데 이렇게 했더니 몇 가지 문제점이 있었다.

  • 이중배열을 한번 돌리고나서 for문을 최대한 단순하게 만들고자 첫 번째 문자를 잘라내는 slicing 방법을 사용해야 했고,
  • indexing을 사용하다보니 일부 문자열이 ''이 되어버리는 경우 error가 발생했다.
  • 너무 모든 내용을 한 조건문/While문 등 안에 표현하려고 하다보니, 오히려 코딩이 복잡해졌다.

그래서 다시 생각한 방식은,

  • 발생할 수 있는 경우의 수를 블럭화 한다.
  • slicing을 사용하지 않고, 첫 먼째 문자열을 기준으로 두고 비교한다.
  • 이 함수가 끝나는 시점은 가장 짧은 길이의 문자가 ''이 될 때이므로, min_length 변수를 선언해서 이를 이용한다.
  • ''이 발생하는 경우는 2가지, 조건문으로 처리한다.
    • strs 안에 있는 요소가 모두 공백이면 '' return
    • strs 요소 중 하나라도 ''이 있으면 '' return

그래서 아래와 같이 다시 풀이.

def get_prefix(strs):
	result = ''
    min_length = min([len(str) for str in strs])
    
    if not strs : return result
    if min_length == 0 : return result
    i = 0 
    while True:
    	std_num = strs[0][i]
        for str in strs:
        	if str[i] != std_num : return result 
        result += std_num
        
        i += 1
        if min_length == i : return result 

좋은 웹페이지 즐겨찾기