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'))
먼저 for문으로 시퀀스 형태인 s를 철자별로 푼다.
이후 이 철자가 sub이라는 다른 문자열에 있는지 없는지를 판별하는데 전제를 '없다면?'으로 잡는다.
없다면 스트링에 추가해준다. 이 때 새로 배운 것이 숫자처럼 +=가 된다는 점.
그리고 answer의 경우 아예 미리 최대값을 구해놓는 것이다. max가 여러 인자를 받을 수 있으므로(숫자만) answer와 sub의 len 값을 answer로 잡는다. 이 두 값중 큰 값만 출력된다. 즉 answer가 더 커지는 순간이 오면 답이 나오고, len(sub)은 단지 그 여러 리스트가 나오는데 까지의 과정인 것이다.
다시 이해한 것 : 컷은 말 그대로 기존에 sub안에 들어있는 값이 처음 중복 될 때의 인덱스 값. 진짜 말 그대로 잘리는 부분
고로 sub[cut:]
은 아무 것도 없는 공백상태. 그러므로 새로 시작해야 하니까 i를 씀. 이 부분에서 알게 모르게 재귀가 일어난 것이다.
이후 answer를 리턴하면 답이 나온다.(그럼 앞에 센게 큰지 뒤에 센게 큰지 나오겠지?)
이해 되지 않은 두 부분이 있어서 이거에 대한 해석을 좀 더 공부해야겠다.
-> 손으로 쓰다보니 이해가 되었다.