코드카타 3일차

문제 : string 형 str 인자 중복되지 않은 알파벳 이뤄진 제일 긴 단어 길이 반환

결과 : 정답 및 해설 참고. 도저히 못 풀어서 Give Up

시도 :

def get_len_of_str(s):
	for i in s:
    ....
    
    or
    
    for i in range(len(s)-1):
    ...
    

위와 같이 재귀를 따로 만들지는 못하고 i와 i+1의 연속된 값으로 구하는 것 까지는 접근했지만 abcdabc의 경우 abc만 나오는 이상한 결과만 나왔다.

어려워서 힘들 때 들은 힌트 :

스트링을 for문을 돌릴 때 임시로 넣을 공간을 만들고 만일 그 공간에 요소가 있다면을 가정으로 완성시키고 join을 넣은 다음 임시 공간을 리셋하는 뭐 그런 식의 로직을 들었다. 좋은 로직이었지만 결과적으로 내가 구현하지 못했다.

결과에 대한 나름의 해석

def get_len_of_str(s):
        answer = 0
        # 단어의 길이 초기화
        sub = ''
        # 임시의 빈 str
        for i in s:
            if i not in sub:
                sub += i
                # i 철자가 없다면 sub에 넣기
                answer = max(answer, len(sub))
                # answer와 sub 길이의 최대값 같이 표기, 둘 중 뭐가 크냐에 따라 값 달라짐)
            else:
                cut = sub.index(i)
                # sub.index(i)의 인덱스값
                # sub.index(i)의 인덱스값
                sub = sub[cut+1:] + i
                # sub[cut:] : 아무것도 없음. 초기화
                # sub의 인덱스 다음값에서부터 i 값 더하기 
                # i가 더해지면서 새로운 sub이 시작됨
        return answer
  

print(get_len_of_str('strttg'))
  1. 구해야하는 문자열의 길이를 answer = 0이라 초기화 하고 잠시 문자가 담겨야할 중간 그릇을 sub이라고 하고 '' 처리한다.
  • 여기서 배운 것 : 꼭 모든 걸 리스트화 할 필요 없다. 리스트를 한 뒤 len으로 돌려서 할 수고를 덜었다. 또 한 join을 굳이 사용하지 않고 답이 나왔다.
  1. 먼저 for문으로 시퀀스 형태인 s를 철자별로 푼다.

  2. 이후 이 철자가 sub이라는 다른 문자열에 있는지 없는지를 판별하는데 전제를 '없다면?'으로 잡는다.

  3. 없다면 스트링에 추가해준다. 이 때 새로 배운 것이 숫자처럼 +=가 된다는 점.

  4. 그리고 answer의 경우 아예 미리 최대값을 구해놓는 것이다. max가 여러 인자를 받을 수 있으므로(숫자만) answer와 sub의 len 값을 answer로 잡는다. 이 두 값중 큰 값만 출력된다. 즉 answer가 더 커지는 순간이 오면 답이 나오고, len(sub)은 단지 그 여러 리스트가 나오는데 까지의 과정인 것이다.

  • 왜 두 값을 넣어? : answer가 클지 len값이 클지 아직 모른다. 뒤에 더 세어봐야 안다.
  1. 만일 if에서 처리가 안 된 것들, 즉 이미 알파벳 철자가 있다면? 그 경우에는 새로운 변수를 선언해준다. 컷 해준다는 뜻에서 cut을 쓰고 이 변수로 sub에서 이미 들어가 있는 알파벳의 인덱스 넘버를 찾는다.
  • 다시 알게 된 것 : index(값) = index number
  1. 다시 이해한 것 : 컷은 말 그대로 기존에 sub안에 들어있는 값이 처음 중복 될 때의 인덱스 값. 진짜 말 그대로 잘리는 부분

  2. 고로 sub[cut:]은 아무 것도 없는 공백상태. 그러므로 새로 시작해야 하니까 i를 씀. 이 부분에서 알게 모르게 재귀가 일어난 것이다.

이후 answer를 리턴하면 답이 나온다.(그럼 앞에 센게 큰지 뒤에 센게 큰지 나오겠지?)

이해 되지 않은 두 부분이 있어서 이거에 대한 해석을 좀 더 공부해야겠다.
-> 손으로 쓰다보니 이해가 되었다.

profile
커피 내리고 향 맡는거 좋아해요. 이것 저것 공부합니다.

0개의 댓글