[Algorithm] 코드카타 - get_len_of_str ( 중복되지 않는 알파벳으로 이루어진 제일 긴 단어의 길이를 반환하기 )

haejun-kim·2020년 8월 5일
0

[Algorithm]

목록 보기
3/3

My Solution

def get_len_of_str(string):
  str_list = []
  max_length = 0
  
  for i in string:
    if i in str_list:
      str_list = str_list[str_list.index(i) + 1:]
      
    str_list.append(i)
    max_length = max(max_length, len(str_list))
      
  return max_length

내가 푼 코드는 위와 같다. 생각한 로직은 어떤 문자열이 주어졌을 때, 리스트에 문자가 이미 존재하면 ( 중복된 문자가 있으면 ) 중복된 문자의 인덱스를 받아와서 그 인덱스에서 +1 을 한 지점에서 끝까지 슬라이싱을 했다.

만약 중복된 문자열이 리스트에 없다면 리스트에 추가해주고, 현재 저장되어 있는 길이값과 중복된 값이 들어와서 새로 길이를 계산한 값 중 더 긴 값을 계산해서 그 값을 리턴해주는 식으로 로직을 풀어나갔다.

이번 문제에서 어려웠던건 str_list.index(i) + 1 이부분과 max(max_length, len(str_list)) 이부분이였고, 내가 생각하지 못한 부분을 동기의 도움으로 풀어나갈 수 있었다.

먼저 str_list,index(i) + 1 부분은 해당 문자열의 인덱스까지는 불러왔는데 그렇게만 불러왔을 경우 중복된 숫자를 포함해서 계속 불러와서 생각한 출력값을 얻을 수 없었다. 그래서 index값을 불러온 값에 +1을 해주었더니 중복된 문자를 제외한 다음 문자열부터 슬라이싱을 해서 중복된 문자 없이 슬라이싱 한 결괏값을 얻었다.

그리고 max(max_length, len(str_list)) 이 부분은 이미 max_length에 어떤 값이 저장되어 있는데 중복된 값이 출력됐지만, 그 값이 이미 저장된 값보다 길이가 적을 경우도 새로 갱신해서 변수에 저장시켜버린다. 그렇게하면 문제에서 요구하는 가장 긴 문자열의 길이값을 얻을 수 없다. max() 를 사용해서 기존에 저장되어 있던 길이값과 중복된 값이 또 생겨 새로운 길이값을 계산했을 때 둘 중 더 큰 값을 비교시켜 변수에 저장시키는 방식으로 이 문제를 해결할 수 있었다.

이번에도 문제는 조금 접근했지만 문제를 해결하는데 있어 가장 크리티컬한 부분은 동기님의 도움을 받았다. 더 노력해야할 부분이 많은 듯 싶다!

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)

내가 풀어낸 코드보다 오히려 더 이해하기가 어려웠다. 아직 조금 어려운 코드를 보면 머릿속에 잘 그려지지 않는 것 같다.

모델 솔루션에서는 인덱스값에서 그 전의 값을 빼는식으로 길이를 얻어왔다. 길이를 얻어야한다는 생각에 나는 잘라서 그 잘린 부분의 길이만 출력해야한다고 생각했지 이 전의 문자열의 길이를 빼서 문자열의 길이값을 얻어낼 수 있는 방법은 생각하지도 못했다.

이로 인해 새로운 로직을 하나 더 익힐 수 있었다.

0개의 댓글