https://www.acmicpc.net/problem/1065
어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두개의 수의 차이가 일정한 수열을 말한다.
N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오.
첫째 줄에 1,000보다 작거나 같은 자연수 N이 주어진다.
첫째 줄에 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력한다.
한수가 무엇인지 이해하지 못해 문제를 파악하기까지 오랜 시간이 걸렸습니다.
처음엔 1부터 99까지의 수가 한수인지 정확한 해답을 말하기가 너무나 어려웠습니다. ㅠㅠㅠㅠ
문제에서는 각 자리의 수가 등차수열을 이룬다면 한수라고 한다는 것은 각 자리의 수의 차이가 일정하면 한수라고 했습니다.
수열이라면 적어도 2개의 수가 존재해야 수열이라 생각했지만 수 한개만 있어도 길이가 1인 수열이라고 볼 수 있다고 합니다.
예를 들자면 한자리 수는
비교할 대상이 없으므로
그 자체로 한수 이고, 두자리 수는수의 차이가 1개 밖에 없으므로
한수 입니다.
따라서 입력 대상은 1000보다 작거나 같은 수
이므로 세자리 수인 100부터 999까지 범위
만 찾으면 되는 것 입니다. 1000은 한수가 아니기 때문에 미리 제외를 시켰습니다.
앞서 말한 것처럼 1부터 99까지의 수는 모두 한수이기 때문에 입력한 수의 크기가 한수의 개수이고 100이상의 수 부터는 각 자리로 나누어 각 차이를 계산하게 됩니다.
첫째 자리는 100을 나누어 몫
으로, 둘째 자리는 100을 나눈 나머지에 다시 10으로 나눈 몫
, 셋째 자리는 10으로 나눈 나머지
로 분류하였습니다.
이제 한수인지 판별을 해야하기 때문에 둘째 자리와 첫째 자리의 차이
, 셋째 자리와 둘째 자리의 차이
를 구하였고 같을 시 한수 이므로 count에 1씩 더해주었습니다.
let num = Int(readLine()!)! // 입력받은 수
var count = 0 // 한수의 개수
func cal (_ num: Int) -> Int { // 한수를 찾기 위한 함수
for i in 100...num {
let firstNum = i/100
let secondNum = i % 100 / 10
let thirdNum = i % 10
if secondNum - firstNum == thirdNum - secondNum {
count += 1
}
}
count += 99
return count
}
if num >= 100 {
print(cal(num))
} else {
count += num
print(count)
}