codekata #3

신승호·2021년 4월 28일

codekata

목록 보기
3/15

codekata_0428


문제

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

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

예를 들어,

str = "abcabcabc"
return 은 3
=> 'abc' 가 제일 길기 때문
str = "aaaaa"
return 은 1
=> 'a' 가 제일 길기 때문
str = "sttrg"
return 은 3
=> 'trg' 가 제일 길기 때문

정답

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)
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)
s = sttrg 이다 ㅡ ㅡ
def get_len_of_str(s):
  c = ""			# C를 임시저장하는곳				
  result = 0			# 최종 결과의 길이
  for i in s:			# sttrg를 하나씩 간다.
    if i not in c:		# 첫번째 글짜("s")가 c(지금은 비었지)에 없으면 / 두번째 글짜("t")가 c(지금은 "s")있지만 없지 / 세번째("t")가 들어갈때 c에는 t가 이미 있네 . .
      c += i			# 그냥 c에 추가가 됌 문자열로
    else:			# 3번째 (t) 가 이미 겹치면 열로와서 들가야지
      if len(c) > result:	# c의 개수는 현재 result(맨첨은 0)이니, 당연히 크고 
        result = len(c)		# 그럼 넘어가서 len(c)로 result로 업데이트 해줘
      c = i			# 그리고 다시 3번째 t를 다시 넣어서 첫번째로 정의해주고 가
`
  if len(c) > result:		#	글고 이제 들어오는 len(c)랑 아까 result랑 비교해서 값 출력 하기
    return len(c)
  else:
    return result

진짜 개어렵누 .. ... .

profile
신승홉니다

0개의 댓글