Programming/ACMICPC

ACMICPC 1065 한수

Lazy Ren 2017. 1. 6. 18:17

문제

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

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

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

입력

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

출력

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


예제 입력

110

예제 출력

99


                         *** 분명 해당 문제의 입력에서 N은 1000보다 작거나 같은 자연수라고 하였으나,

                              정답 처리기는 10000보다 작거나 같은 자연수(가정)에 대해 채점한다. 

                              확실한 것은 1050이상의 숫자에 대한 데이터를 채점한다는 것.***

등차 수열이란?

등차수열은 연속하는 두 항의 차이가 모두 일정한 수열을 뜻한다. 예를 들어 1, 3, 5, 7, 9, ...은 등차수열이다. 

이때 두 항의 차이는 이 수열의 모든 연속하는 두 항들에 대해서 통적으로 나타나는 이므로, 공차라고 한다.


일단 "한수"가 무엇인지 정확히 짚고 넘어가야한다.

세자리 숫자 n (= c*100 + b*10 + a)이 있다고 가정하였을때,

a-b = b-c 이어야 한수이다. 이때 a-b 값이 몇 인지는 중요하지 않다. 그 값은 음수일수도, 0일수도 있다.

그렇다면 한자리수, 두자리수는 어떨까?

모든 한자리수와 두자리수는 수열을 이루는 값이 없거나 1개만이 존재하기 때문에 한수라고 판단한다.

예제의 입력과 출력을 보면 확실히 알 수 있다. 100 ~ 110 사이의 숫자중 한수는 없으며 예제의 출력이 99임을 유의하여야 한다.


코드 자체는 어렵지 않다. 각 자리수 숫자간의 차를 구한 후 이들이 같은 값인지(공차인지)를 확인해주면 된다.

허나 앞에 말했듯이 N의 값이 1000을 넘어서는 값도 채점한다는데에 유의하여 코드를 짜야한다.


N 값이 100미만일때 한수의 갯수는 N과 같다는 것.

N이 네자리 수 경우 세자리 수일때보다 공차의 갯수가 한개 더 많다는 것에 유의하여 문제를 풀면 된다.