[Codekata] Week1 - Day3

Jungmin Seo·2021년 6월 24일
0

Codekata

목록 보기
3/10

🍔 문제

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

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

예를 들어,

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

🍟 풀이

#1 나의 풀이

중복되는 문자가 나올 경우, 그 이전부분을 다 날리고 중복되는 문자가 나온 시점부터 다시 시작하는 풀이
ex) 'abcaz' > abc / az      return값 = 3

def get_len_of_str(s):
    a = []
    max_len = 0
    s_list = list(s)

    # a 리스트에 있는 요소일 경우, 그 전까지의 리스트의 길이를 max_len에 저장
    for i in s_list:   
      if i in a:    
        if len(a) > max_len:    
          max_len = len(a)
        a = []
        
      a.append(i)

    # 마지막 요소가 a에 없어서 새로 추가되는 경우의 a길이
    if len(a) > max_len:    
      max_len = len(a)   

    return max_len

#2

중복되는 문자가 나올 경우, 앞에 이미 있던 중복되는 문자의 다음 문자부터 시작하는 풀이
ex) 'abcaz' > a / bcaz      return값 = 4

def get_len_of_str(s):
  a_dict = {}
  starting_point = 0
  result = 0

  for i, c in enumerate(s):
    # if 조건 아래 추가 설명!
    if c in a_dict and a_dict[c] >= starting_point:
      starting_point = a_dict[c] + 1
    a_dict[c] = i
    result = max(result, i - starting_point + 1)

  return result

Test Case

s = 'eacfczei'

두번째 e가 들어가는 경우,
a_dict 안에 {'e': 0}가 들어있고, starting_point=3(첫번째 c의 다음인 f)인 상태이다.

if c in a_dict and a_dict[c] >= starting_point

  • c in a_dict : 'e'가 a_dict 안에 이미 있어야 하고,
  • a_dict[c] >= starting_point:
    a_dict안에 있는 'e'의 index가 0이고 현재 starting_point=3인데, 이 조건이 없다면 starting_point=1이 된다. -> 앞에서 지나온 'c'가 다시 중복되어 문자열에 포함되는 상황.

    두 조건이 모두 충족되어야 한다!
profile
Hello World!

0개의 댓글