[BOJ] 1065

Posted by RoadtoS7 on January 09, 2020 · 1 min read

##문제 어떤 양의 정수 X의 자리수가 등차수열을 이룬다면, 그 수를 한수라고 한다.

등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다.

N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오.

풀이과정

  • 예제 입력2 1의 예제 출력을 보았을 때, 일의 자리 수는 전부 한수에 해당한다는 것을 알 수 있다.
  • 예제 입력1 110의 예제 출력을 보았을 때,세자리 숫자와 일의 자리 수만 한수가 된다면 110이하의 한수는 하나도 없어야 하는데 99개가 나온 것을 보아 십의 자리 숫자도 전부 한수에 해당한 다는 것을 알 수 있다. (십의 자리 숫자는 10부터 99까지 존재하고, 일의 자리 숫자는 1부터 9까지 존재한다. 따라서 이들 전부가 한수라면 110 이하의 한수로 99가 나오는 것이 당연하다.)

예제를 통해서 얻은 힌트를 조합해 볼 때, 99 이하의 수가 입력된다면 이 숫자 만큼의 한수가 존재한다. 110 이하의 수가 입력된다면 백의 자리 수에서 첫번째 한수인 111보다 작기 때문에 십의 자리 숫자의 개수와 일의 자리 숫자의 개수의 합인 99개 만큼의 한수가 존재한다.

따라서 110 보다 큰 숫자에 한 해서만, 111부터 1씩 증가시키며 입력된 숫자가 될 때 까지 반복을 돌며, 증가시킨 수가 한수에 해당하는지를 체크하면 된다. 한수에 해당하는지 확인하는 방법은 등차수열의 특징인 항차가 같음을 이용한다. 즉, 십의 자리수 - 백의 자리수 == 일의 자리수 - 십의 자리수 가 참이면 한수이다.

코드

num = int(input())

if num <= 99:
    print(num)

elif num <= 110:
    print('99')

else:
    result = 99

    for i in range(111,num+1):
        hunNum = i // 100
        tenNum = (i % 100) // 10
        oneNum = (i % 100) % 10

        if tenNum - hunNum == oneNum - tenNum:
            result+=1

    print(result)