n의 제한을 정확히 알 수 없을 경우

2017-01-17 03:23:38 | 조회수 852


만약 n의 값이 좀 더 크거나 알 수 없다면 문제가 되는 부분은 if문에 있는 자리 별로 7이 있는지를 판별하는 문제입니다. 만약 Python의 setrecursionlimit이 굉장히 높게 잡혀 있어 100자리 정도의 숫자까지 input이 들어온다면 그것을 모두 if문에 쓸 수는 없겠죠? 따라서 이 부분도 재귀화를 시켜봅시다.


먼저 앞전의 완성된 소스입니다.

n = int(input())


def pdfs(k):

    if(k>n):

         return 0

    if(k%7==0 or k%10==7 or int(k/10)%10==7 or int(k/100)%10==7 or int(k/1000)%10==7):

        return mdfs(k+1)+1

    else:

        return pdfs(k+1)+1

def mdfs(k):

    if(k>n):

         return 0

    if(k%7==0 or k%10==7 or int(k/10)%10==7 or int(k/100)%10==7 or int(k/1000)%10==7):

        return pdfs(k+1)-1

    else:

        return mdfs(k+1)-1    

print(pdfs(1))


저 if문을 수정하여 봅시다. 각 자리수에 7이 있는지 검사하기 위해 앞선 소스에서는 10으로 나눈 몫에서 10을 나누고, 또 100으로 나눈 몫에서 10을 나누고.. 를 반복하였습니다. 이 부분을 재귀함수로 구현할 수 있을 것 같습니다. 10으로 나눈 나머지가 7이 아니라면, 10으로 나눈 몫을 재귀 함수에 넘겨주고, 이 과정을 숫자가 0이 될 때 까지 하면 될 것입니다. 다음과 같이 작성할 수 있습니다.


def hasSeven(k):

    if(k==0):

        return False

    if(k%10==7):

        return True

    return hasSeven(int(k/10))


위의 소스를 적용하여 완성된 소스입니다.


n = int(input())

def hasSeven(k):

    if(k==0):

        return False

    if(k%10==7):

        return True

    return hasSeven(int(k/10))


def pdfs(k):

    if(k>n):

        return 0

    if(k%7==0 or hasSeven(k)==True):

        return mdfs(k+1)+1

    else:

        return pdfs(k+1)+1

def mdfs(k):

    if(k>n):

        return 0

    if(k%7==0 or hasSeven(k)==True):

        return pdfs(k+1)-1

    else:

        return mdfs(k+1)-1    

print(pdfs(1))



n의 제한을 정확히 알 수 없을 경우 - 알고리즘닷컴
32 개의 글