본문 바로가기

BOJ/Python

[BOJ/백준] 31520 - Champernowne Verification (Python)

문제

문제링크

k번째 Champernowne 단어는 첫 k개의 양의 정수를 차례대로 나열한 것이다.

양의 정수 n이 주어졌을 때, 이것이 Champernowne인지 판별하고 맞으면 몇 번째 Champernowne 단어인지 구하고,

아니라면 -1을 출력하라.

 

풀이

k=1부터 시작하여 n의 길이가 k의 길이보다 작아지는 경우까지 아래의 과정을 반복한다.

k가 n의 맨 앞에 있는지 startswith()로 판별하고, 맞다면 k의 자릿수만큼 n의 맨 앞 자리에 해당하는 부분을 제거한다.

k에 1을 더해주고 계속 반복한다.

맨 앞에 없다면 이 수는 Champernowne이 아니다.

while문이 종료될 때까지 return 값이 없었다면 이 수는 Champernowne이다.

이 상황에서 k 값은 원하는 값에 1이 더해진 값이므로 k-1을 return한다.

 

코드

def Champernowne(n):
    k=1
    while len(n) >= len(str(k)):
        str_k=str(k)
        if n.startswith(str_k):
            len_k=len(str_k)
            n=n[len_k:]
            k+=1
        else:
            return -1
    return k-1

n=input()
print(Champernowne(n))