2월 16, 2022

[CodeKata] 중복되지 않은 알파벳으로 이루어진 제일 긴 단어의 길이를 반환

 문제는 이러합니다.


풀이 1.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
def get_len_of_str(s):
    # 아래 코드를 작성해주세요.
    lst = []
    if s == "":
        return 0
    else:
        lst.append(s[0])
        longest = []
        for i in s[1:]: 
            if i in lst:
                longest.append(len(lst))
                lst = [i]
            elif i not in lst:
                lst.append(i)
                longest.append(len(lst))
        return max(longest)저

접근 방법:

for 문을 통해 s의 각 요소들을 리스트에 넣어주다가, 중복되는 값이 나올 시, 리스트의 길이를 저장해 준 뒤, 리스트를 초기화하고 중복되는 값부터 새롭게 추가되는 리스트를 추가하려 했습니다.


우선, 요소들을 넣어줄 lst라는 리스트를 만들어줍니다. 

원래는 else: 문 이하의 코드만 만들었는데요, s가 빈 리스트인 경우에는 7번째 줄의 

lst.append(s[0])이 Index out of range 에러가 나게 됩니다. 따라서 if와 else로 s가 빈 문자열인 부분과, 아닌 부분을 분기해주고 시작합니다.

s가 0이 아니라면, lst라는 리스트에, 문자열 s의 첫 번째 값을 넣어줍니다.

여기서 실수를 하나 했습니다.

lst.append([s[0]])


수를 하나 했습니다. 이런식으로 s의 첫번째 값을 리스트 안에 넣어서 lst에 append 해주는 바람에, 나중에 for문에서 lst안에 i 값이 있냐를 따질때 문제가 발생했습니다.
예를들어 [['a']] 면 리스트 안에 ['a']가 있는 것이지 'a'가 있는 것이 아니잖아요? 그래서 고생을 좀 하다가 바깥의 []를 제거해줌으로써 문제를 해결할 수 있었습니다.
또한, 짤리기 전까지의 각 리스트의 길이를 비교해주기 위해 longest란 리스트를 만들었습니다.

다음으로 for문을 돌려주어서 i가 lst안에 있나 / 없나를 확인합니다.
문제에서 "중복되지 않은 알파벳" 이라고 해주었기 때문에, 바로 전의 값이 아니더라도 , 이전의 문자열 어딘가에서 중복되는 값이 있다면, 거기서 lst가 커지는 것을 멈춰줘야 합니다.
따라서 in 을 사용하여, lst 리스트의 어디에라도 i와 같은 값이 있는지를 확인했습니다.

만약 i가 lst안에 있다면, longest에 여태까지의 lst의 length값을 넣어주고, lst를 i값으로 초기화해줍니다.
만약에 i가 lst안에 없다면, lst에 i값을 더해주는 것을 계속합니다. 이때도 longest에 lst의 length 값을 계속 append 해줘도 되는데, 어차피 max의 값을 꺼낼것이기에 상관없습니다.

그리고 longest의 max값을 리턴해주면 됩니다.