string형인 str인자에서 중복되지 않은 알파벳으로 이루어진 제일 긴 단어의 길이를 반환해주세요.
str: 텍스트
return: 중복되지 않은 알파벳 길이 (숫자 반환)
예를 들어,
str = "abcabcabc"
return은 3
=> 'abc' 가 제일 길기 때문
str = "aaaaa"
return은 1
=> 'a'가 제일 길기 때문
str = "sttrg"
retun은 3
=> 'trg'가 제일 길기 때문
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)