[Python] Code Kata Day3

rang-dev·2020년 6월 10일
0

Wecode - Code Kata

목록 보기
3/18

문제

String 형인 str 인자에서 중복되지 않은 알파벳으로 이루어진 제일 긴 단어의 길이를 반환해주세요.

str: 텍스트
return: 중복되지 않은 알파벳 길이 (숫자 반환)

예시

예를 들어,
str = "abcabcabc"
return은 3
=> 'abc' 가 제일 길기 때문

str = "aaaaa"
return은 1
=> 'a' 가 제일 길기 때문

str = "sttrg"
return은 3
=> 'trg' 가 제일 길기 때문

내코드

def get_len_of_str(string):
  new_str = str()
  str_dict = dict()
  
  for i in range(len(string)):
    if string[i] in new_str:
      str_dict[new_str] = len(new_str)
      new_str = str()
      new_str += string[i]
    else:
      new_str += string[i]
    
    if i == len(string)-1:
      str_dict[new_str] = len(new_str)

  if str_dict == {}:
    result = 0
  else:
    result = max(str_dict.values())
  return result

일단 for문을 돌면서 중복이 나오기 전까지의 알파벳을 new_str에 저장한다. 만약 중복이 발생하면 지금까지 저장했던 new_str을 len과 함께 str_dict에 저장한다.(ex. {'abc':2})
그리고 new_str을 다시 리셋한 후 중복이 없는 새로운 알파벳들을 담는다. 그리고 또 중복이 발생하면 str_dict에 저장하는 것을 반복한다.

맨 처음에는 생각없이 len을 key로 잡아서 알파벳들이 제대로 카운트 되지 않는 문제가 발생했었는데(동일한 len이 발생했을때 누락되는 알파벳 생김) 알파벳을들을 key로 하니 제대로 잘 카운트 되었다.

마지막에 완성된 str_dict의 value들 중 가장 큰 값을 return하면 된다.

ex) 만약 string이 abcabcdabcdef가 주어졌다면..
str_dict = {'abc':3, 'abcd':4, 'abcdef':6}

Model Solution

def get_len_of_str(s):
	dct = {}
	max_so_far = curr_max = start = 0
	for index, i in enumerate(s):
		if i in dct and dct[i] >= start:
			max_so_far = max(max_so_far, curr_max)
			curr_max = index - dct[i]
			start = dct[i] + 1
		else:
			curr_max += 1
		dct[i] = index
	return max(max_so_far, curr_max)

나랑 비슷한 논리로 푼 것 같은데 너무 복잡해서 이해하려다가 실패했다 ㅠ


https://wikidocs.net/16045

https://stackoverflow.com/questions/27272034/what-is-a-b-c-in-python

profile
지금 있는 곳에서, 내가 가진 것으로, 할 수 있는 일을 하기 🐢

0개의 댓글