(Python) 알고리즘문제 D+3

Kepler·2020년 2월 12일
0

알고리즘

목록 보기
3/8

문제

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

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

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

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

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


해답 (model solution_1)

def get_len_of_str(s):
    if len(s) == 0:      # 문자열의 길이가 0일때 0을 리턴.
        return 0

    map = {}        # 중복되지 않는 문자열과 그 인덱스를 딕셔너리에 추가
    max_length = start = 0  # 최대길이와 스타트 인덱스는 0에서 시작

    for i in range(len(s)):
        if s[i] in map and start <= map[s[i]]:   #중복 문자열이 이미 딕셔너리에 존재하며, 스타트 인덱스가 중복 문자열의 인덱스보다 작거나 같은 경우, (abcabc에서 두번째 a가 등장했을때)
            start = map[s[i]] + 1   # 스타트 인덱스 위치를 최초 중복 문자열의 인덱스에 1을 더하여 slide 시킴 (abcabc의 경우, a가 아니라 b 부터 길이를 재도록, 중복 문자열이 나올때마다 최초 중복 문자열을 제외하고 다시 카운트가 시작되도록 )
        else:  # 중복 문자열이 딕셔너리에 존재하지 않는 경우,
            max_length = max(max_length, i - start + 1) # 최대 길이는, 현재 최대 길이와 현재 문자열의 인덱스에서 스타트 인덱스를 뺀 문자열의 길이(길이를 구하므로 1을더해줌) 둘 중에 max값으로 지정.
        map[s[i]] = i     # 해당 요소의 철자를 key, 인덱스 값을 value로 하여 map 딕셔너리에 추가.

    return (max_length)

해답 (model solution_2)

def get_len_of_str(s):
	dct = {}           # 중복되지 않는 문자열과 그 인덱스를 딕셔너리에 추가
	max_so_far = curr_max = start = 0        # 지금까지 최대길이, 현재 최대길이, 스타트 인덱스는 0부터 시작
	for index, i in enumerate(s):         # enumerate를 사용하여 문자열과 index를 딕셔너리에 저장
		if i in dct and dct[i] >= start:    # 해당 문자열이 이미 딕셔너리에 존재하며, value가 스타트 값보다 큰 경우
			max_so_far = max(max_so_far, curr_max)   # 지금까지 최대길이는, 지금까지 최대길이와 현재 최대길이중의 max값
			curr_max = index - dct[i]      # 현재 최대길이는 새로운 중복 문자열의 인덱스에서 최초 중복 문자열의 인덱스를 뺀 값으로 갱신
			start = dct[i] + 1     #스타트 인덱스는 최초 중복 문자열에 1을 더한 장소로 slide시킴
		else:    # 해당 문자열이 딕셔너리에 존재하지 않는 경우
			curr_max += 1     # 현재 최대길이를 1씩 증가시키고,
		dct[i] = index        # dct에 key가 해당 문자열, value가 해당 문자열의 인덱스 값으로 하여 요소를 저장
	return max(max_so_far, curr_max)
profile
🔰

0개의 댓글