Code Kata #3 (중복되지 않은 알파벳 중 가장 긴 단어)

Jayson Hwang·2022년 5월 11일
0

CODE KATA

목록 보기
1/1
post-thumbnail

Question:

string형인 str인자에서 중복되지 않은 알파벳으로 이루어진 제일 긴 단어의 길이를 반환해주세요.
str: 텍스트
return: 중복되지 않은 알파벳 길이 (숫자 반환)

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

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

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

My Answer:

def get_len_of_str(s):
    # 아래 코드를 작성해주세요.

  a = []
  # 빈 리스트 생성 // 혹은 a = set()로 빈 세트를 생성해도 무방
  longest = 0
  # 가장 긴 단어의 길이

  for i in range(len(s)): # 's'의 각 인덱스 값들로 for loop을 돌림
    alph = s[i]

    if alph in a:
      if len(a) > longest:
        longest = len(a)
        a.clear()
        a.append(alph)
    # 만약 중복이 되는 알파벳이 나올 경우, 현재 'a'의 길이와 longest를 비교하여 longest를 새로 갱신하고,
    # 'a' 리스트 혹은 세트를 비워준 후 중복된 alph 값을 다시 'a'리스트에 넣어준다.
    # 그 후 동일하게 for loop 진행
    
    else:
      a.append(alph)

  return max(longest, len(a))
    # longest 와 len(a) 중에 큰값을 Return
    # max()를 쓴 이유는 만약 중복되는 값이 없는 's'가 입력될 경우에는
    # 함수가 끝날 때까지 'longest = 0' 이다.
    # 따라서 longest 와 len(a) 값을 비교하여 가장 최대 값을 Return 할 수 있도록 해야한다.

가장 쉬운 접근 방법이라 생각했던 방법은

빈 리스트 혹은 빈 세트 'a' 를 만들고, 's'의 모든 인덱스 값들을 차례로 빼내어 'a'에 넣어준 후 중복되는 값이 나올 때마다 단어 길이를 비교함으로써 가장 긴 단어의 길이를 갱신해서 Return하는 방법
(사실은 이 방법 말고 다른 방법은 아예 생각이 안났음.....)



가장 완벽한 풀이라고 생각되는 답안 ::

def get_len_of_str(s):
    # 딕셔너리로 해싱
	dct = {}
	max_so_far = curr_max = start = 0
    # enumerate로 문자열의 인덱스와 문자를 돌려주고 이를 반복
	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:~~텍스트~~
            # 길이+1
			curr_max += 1
        # 문자열을 탐색할 때마다 위치값을 저장
		dct[i] = index
	return max(max_so_far, curr_max)
profile
"Your goals, Minus your doubts, Equal your reality"

0개의 댓글