본문 바로가기

알고리즘 문제

백준 알고리즘 한수 1065번

문제

어떤 양의 정수 X의 자리수가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오. 

입력

첫째 줄에 1,000보다 작거나 같은 자연수 N이 주어진다.

출력

첫째 줄에 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력한다.

예제 입력 

110

예제 출력 

99









값을 리스트에 넣고 복사한다. 그러면 같은 값을 갖는 리스트가 2개다.

자리수를 맞춰주기 위해 첫번째 리스트의 마지막 원소를 삭제하고 두번째 리스트의 첫번째 원소를 삭제한다.

각 자리수끼리 빼서 같다면 count를 1 증가시킨다.




소스코드


N = int(input()) #N 받음

count = 0 #출력 값

while N > 0: #입력값이 1 이상이면 반복

    if N>=100: #입력 값이 100이상일 때

        num = list(str(N)) #값을 문자열로 변환 후 리스트에 넣음

        num2 = num.copy() #num2에 값 복사

        # 자리수를 맞추기 위해 값 삭제

        del num[-1] #리스트 맨 마지막 값 삭제

        del num2[0] #리스트 맨 처음 값 삭제

        if int(num[0]) - int(num2[0]) == int(num[1]) - int(num2[1]): #같은 자리 수끼리 뺀 값이 같다면

            count += 1 #count 1 증가

    elif N < 100: #1~99까지는 모두 등차수열...

        count += N #N의 초기값이 100이상일 경우 누적된 count와 99가 합해짐. 99이하의 숫자가 초기 N값이라면 그대로 출력

        break

    N -= 1

print(count)



입력되는 숫자는 1000이하인데 1000이면 한수가 100% 아니므로 100~999까지의 값을 고려해본다면 위 그림과 같이 두 자릿수만 비교하면 된다.

그리고 1~99까지의 숫자는 모두 한수이다.

왜냐하면 한 자리수는 한 자리밖에 없으므로 한수 취급하고

두자리수는 첫번째 자리수와 두번째 자리수를 빼도 단일 값이 나오기 때문이다.


EX) 99 -> 9-9=0, 57 -> 5-7 = -2