-
파이썬 알고리즘 - 알파벳의 중복이없는 가장 긴 단어/뒤집은수 일치일반 프로그래밍/알고리즘 2022. 4. 14. 18:48
문제 3: String 형인 str argument에서 중복되지 않은 알파벳으로 이루어진 제일 긴 단어의 길이를 반환하라.
나의 답(오답)
def get_len_of_str(str): list = [] s = '' for i in range(1,len(str)): if str[i-1] != str[i]: str = str + str[i-1] elif str[i-1] == str[i]: s = s + str[i-1] list.append(str) s = '' return len(max(list))
문자열의 인덱스 기능을 이용해 str의 i-1번째 문자와 i번째의 문자가 다르면 string 속성인 s 변수에 문자를 추가하고, 다르면 일단 i-1번째의 문자를 str에 추가한 후 이를 다시 list에 추가하고, str을 초기화하였다. 이러한 일련의 과정을 i가 1부터 str의 길이가 될 때까지 반복하게 하는 것이 첫 번째 코드다.
그러나 크게 두 가지 문제가 있었는데, 첫 번째로 주어지는 str이 빈 문자열일 경우 대응할 수 없었고, 두 번째로 'abcabcabc' 같이 한 단어 안에 중복된 알파벳이 있지만 양옆의 알파벳이 서로 다른 경우는 결괏값을 정확히 도출해낼 수 없었다.
두 번째 나의 답
def get_len_of_str(str): list = [] length = 0 for i in range(len(str)): if str[i] not in list: list.append(str[i]) else: list = [str[i]] length = max(length, len(list)) return length
결국 검색을 통해 문제 해결에 필요한 원리를 찾았고, 이를 이용한 새로운 답안을 작성하였다.
먼저 문자열에 알파벳을 더하고 그 문자열을 리스트에 추가하는 대신, 리스트에 직접 알파벳을 추가하는 코드를 통해 불필요한 코드를 줄였다.
그리고 중복검사를 서로 앞뒤가 같은지만 확인하는 것이 아닌 리스트에 그 알파벳이 있는지를 검사하여 중복 검사를 수행하게 하였다. 이에 더불어 중복된 단어가 있을 경우 list를 아무것도 없는 값으로 초기화하는 대신, str의 i번째 문자만 포함된 상태로 초기화를 시키게 코드를 작성하였다. 이러한 일련의 과정을 통해 위에서 지적한 str이 반복되는 문자열로 이루어진 경우를 통과할 수 있었다.
마지막으로 str이 빈 문자열로 주어지는 경우를 대비해 length변수를 선언하고 값으로 0을 주어, 최종적으로 빈 문자열일 경우 0이 출력되게 하였다.
문제 4 : 숫자인 num을 argument로 전달하였을 때, num을 뒤집은 모양이 num과 똑같은지 여부를 반환하라.
나의 답
def same_reverse(num): compare_num1 = str(num) compare_num2 = compare_num1[::-1] if compare_num1 == compare_num2: return True else: return False def same_reverse(num): #간단화 return str(num) == str(num)[::-1]
num을 문자형으로 변경한 형태를 비교할 두 변수인 compare_num 변수들에 선언하고, 슬라이싱 기능을 통해 뒤집어서 서로 비교한 결과를 True or False로 리턴하였다.
두 번째 답은 return 뒤에 비교 연산자를 이용하면 리턴 값이 True or False 둘 중 하나라는 점을 이용하여 첫 번째 답안을 간단화한 것이다.
'일반 프로그래밍 > 알고리즘' 카테고리의 다른 글
파이썬 알고리즘 - 복소수 곱 구하기, 배열 뒤집기 (0) 2022.04.26 파이썬 알고리즘 - 자주 등장한 숫자구하기, 넓이 구하기 (0) 2022.04.22 파이썬 알고리즘 - 과반수 찾기, 괄호 유효성 검사 (0) 2022.04.20 파이썬 알고리즘 - 공통시작단어 반환, 로마숫자 변환 (0) 2022.04.18 파이썬 알고리즘 - 덧셈 수 찾기 / 숫자 뒤집기 (0) 2022.04.12