TIL20. 코드카타 Day3~5

Byoungju Park·2021년 7월 24일
0
post-thumbnail
post-custom-banner

Day3

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

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

출력예제
str = "abcabcabc"
return 은 3
=> 'abc' 가 제일 길기 때문

str = "aaaaa"
return 은 1
=> 'a' 가 제일 길기 때문

str = "sttrg"
return 은 3
=> 'trg' 가 제일 길기 때문

처음 내가 작성한 코드는 바로 옆 문자열만 비교하는 조건문이었다. 이 코드로 진행하면 "abcabcabc" 에 대해서는 9가 리턴된다. 중복이 없는 알파벳을 누적하며 비교해야 한다.

고려한 부분
1. 중복 여부에 대한 조건을 추가해야 한다 >> count 함수를 써서 값이 0이면 중복이 없는 것
2. 앞 단어가 길면 기록해놔야 한다 >> 리스트에 넣어줌
3. 리스트를 내림차순한 첫번째 값이 가장 긴 값이 된다

제출 답안

def get_len_of_str(s):
    a = ""
    list = []
    
    for i in range(len(s)):
        if (a.counts[i] == 0):
            a += s[i]
        	list.append(len(a))
        else:
            list.append(len(a))
            a = s[i]
            
    list.sort(reverse=True)
    return list[0]

Day4

Q. 숫자인 num을 인자로 넘겨주면, 뒤집은 모양이 num과 똑같은지 여부를 반환해주세요.

num: 숫자
return: true or false (뒤집은 모양이 num와 똑같은지 여부)

고려한 부분
1. 뒤집은 모양을 슬라이싱으로 나타낸다.
2. 슬라이싱을 하려면 숫자를 문자형으로 변환한다.

제출 답안

def same_reverse(num):
    s = str(num)
    if (s == s[::-1]):
      return True
    else:
      return False

다른 분들 풀이를 보니 한 줄로 표현하는 것도 가능하다. 쉽게 풀린다고 끝이 아니라 간결성도 생각하면서 작성해야겠다.

다른 답안

def same_reverse(num):
    return str(num)[:] == str(num)[::-1]

Day5

Q. strs은 단어가 담긴 배열입니다. 공통된 시작 단어(prefix)를 반환해주세요.

출력예제
strs = ['start', 'stair', 'step']
return은 'st'

strs = ['start', 'wework', 'today']
return은 ''

고려한 부분
1. 인자가 리스트이기 때문에 for 문을 사용하는게 가장 편할 것 같았다.
2. 각 문자열의 인덱스는 리스트의 인덱스와 다르게 흘러가야 하기 때문에 While 문을 사용했다.
3. 문자열간 값이 같지 않을 때 빈 문자열에 이전까지 같은 알파벳을 넣어주고, 리스트에 추가한다.

제출 답안

def get_prefix(strs):
    word = ""
    lst = []
    
    for i in range(len(strs)-1):
        j = 1
        
        while True:
        if (strs[i][j] == strs[i+1][j]):
            j += 1   
        else:
            word += strs[i][:j-1]
            lst.append(word)
            break
            
    lst.sort()
    return lst[0]

주어진 출력 예제는 값이 나왔지만, 테스트 검사에서는 무한 루프에 빠졌다. 앞쪽 문자열의 길이가 뒤쪽 문자열의 길이보다 클 경우를 생각하지 못했다. 이외에도 여러 경우의 수를 생각하지 못해 테스트에 통과하지 못한 것 같다.

다른 분들의 방법을 들어보니 접근이 달랐다. 아래와 같이 리스트를 sort 시킨 다음 맨 앞과 맨 뒤 값만 비교하는 방식이다. 이렇게 접근하면 문자열 인덱싱에 대한 문제를 생각하지 않아도 되고 훨씬 간결한 코드가 된다.

다른 답안

def get_prefix(strs):
  strs.sort()
  word = ""

  for i in range(len(strs[-1])):
    if (strs[0][i] == strs[-1][i]):
      word += strs[0][i]
    else:
      break

  return word
profile
wanna be good programmer
post-custom-banner

0개의 댓글