ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 31.4 연습문제 : 재귀호출로 회문 판별하기
    코딩도장 심사문제모음 2020. 11. 4. 13:18
    728x90

    다음 소스 코드를 완성하여 문자열이 회문인지 판별하고 결과를 True, False로 출력되게 만드세요. 여기서는 재귀호출을 사용해야 합니다.

    첫 접근 방법

    연습문제 치고는 여러웠다.

    힌트를 봐야만 실마리를 잡을 수 있었다.

    사실 회문을 왜 재귀호출로 판별해야하는지는 이해가 가질 않는다.

    또한, 이전에 배웠던 index 슬라이싱을 이용해야 한다는 점에서 다시 한번 인지되어 좋은 문제였다.

    풀이

    ## 해당 함수는 True or False 두가지 값을 반환해야하므로 재귀호출을 중지시켜주는 조건이 2개가 필요하다

    def rrr (word):
        if len(word) < 2:
            return True
        elif word[0] != word[-1]:
            return False
        else:
            return rrr(word[1:-1])
    
    print(rrr('level'))
    ::
    True

     

    def rrr (word):
        if len(word) < 2:
            return True
        if word[0] != word[-1]:
            return False
        return is_palindrome(word[1:-1])
        
    ## 코딩 도장 답안

    조건문1을 하나씩 살펴보자

    def rrr (word):
        if len(word) < 2:
            return True
    

    if len(word) < 2

    ==> 인수로 주어지는 문자열의 길이가 2 미만으로 될때라는 뜻으로

    재귀호출을 중지하는 조건 중 하나이다.

    회문을 판별하는 과정에서 해당 조건문으로 호출되어 되돌아오는 경우는 결국 회문이라는 이야기이며

    해당 회문의 길이가 2 미만, 즉 비교대상이 없을때 반환값 True를 준다.

    ## 여기서 리턴 값을 주지 않으면 후에 출력 결과가 None으로 나오게 된다. 

    ## 함수가 완료되었을때의 반환 값으로 줘야 우리가 확인이 가능하기 때문이다.


    조건문2를 살펴보자

    def rrr (word):
        if len(word) < 2:
            return True
        if word[0] != word[-1]:
            return False
        

    if word[0] != word[-1]:

    ==> 인수로 주어진 문자열의 인덱스 번호를 이용하여

    맨처음 문자열의 인데스 0번과 맨 뒤의 문자열의 인덱스 -1을 비교한다.

    해당 여기서 회문이 아닐 경우 바로 반환값 False로 끝나며 아래 rrr 함수를 호출하지 않는다.

    def rrr (word):
        if len(word) < 2:
            return True
        if word[0] != word[-1]:
            return False
        return is_palindrome(word[1:-1])
        
    ## 코딩 도장 답안

    만약 두 값이 같을 경우

    ==> ex : level ==> 인덱스 0번 == " l " , 인덱스 -1번 == " ㅣ" 이 같을 경우 

    return rrr (word[1:-1])

    rrr 함수를 재귀호출하여 길이가 2미만이 될때까지 계속 재귀호출이 이어지는지 검증한다.

    여기서 해당 문제의 키포인트는 재귀호출의 인수(?)라고 생각된다.

    ## 재귀호출이 일어나는 경우 는 곧, 회문일 가능성이 있으며 위의 조건문을 통해 지속적으로 비교가 가능해야한다.

    ## 여기서 rrr함수의 word[1:-1] 값으로 다시  rrr을 재귀호출 시키는데, 

    word[1:-1] ==> index slicing으로 word의 인덱스 2 ~ -2까지 원하는 부분만 자르겠다는 의미이다.

    ex : level ==> word[1:-1]  == eve 가 된다.

    ## 여기서는 return 을 통해 재귀호출을 시키는 이유는

        word 값에따라 계속해서 회문을 판별해야하기 때문으로 보인다.

     

     

     

     

     

     

     

     

     

    728x90
Designed by Tistory.