문제 링크
1065번: 한수
어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나
www.acmicpc.net
문제 해설
1부터 1000까지의 모든 경우를 계산해야하는 완전탐색 문제다. n이 주어졌을 때 n 이하의 수 중 각 자리수가 등차수열을 이루는 수의 총 개수를 구해야한다.
우선 생각해야하는 점은 수열의 항이 2개 이하인 모든 수열은 등차수열이 된다는 점이다. 항이 1개뿐인 경우는 공차가 몇이든 상관 없이 등차수열이 되고, 항이 2개인 경우는 두번째 항 - 첫번째 항의 값이 공차인 등차수열이 되기 때문이다. 예를 들어, X가 31이라면 각 자리를 항으로 하는 수열을 만들면 공차가 -2인 등차수열이 된다. 따라서 n이 99 이하라면 n이 곧 답이 된다.
n이 100 이상이면 111부터 검사하면 된다. 1~99까지는 위와 같은 이유로 모두 등차수열이기 때문에 검사할 필요가 없고, 100~109는 두번째 항과 첫번째 항의 차이가 -1인데, 이렇게 되면 마지막 자리수가 -1인 수가 되어야 하지만 이런 경우는 존재할 수 없다. 110의 경우는 두번째 항과 첫번째 항의 차이가 0이고 세번째 항과 두번째 항의 차이가 -1이기 때문에 등차수열이 될 수 없다.
마지막으로 x가 1000일 경우에는 100~109의 경우와 마찬가지로 등차수열이 성립하지 않는다.
Code
fun main() = with(System.`in`.bufferedReader()) {
val n = readLine().toInt()
var cnt = if (n > 99) 99 else n // 99 이하인 모든 경우는 등차수열
for (i in 111..n) {
val arr = i.toString().toCharArray().map { it - '0' } // i의 각 자리수를 리스트로 변환
if (i % 100 == 0) continue
else if (arr[1] - arr[0] == arr[2] - arr[1]) cnt++
}
println(cnt)
}
'Algorithm > BOJ' 카테고리의 다른 글
[Kotlin] 백준 11292 : 키 큰 사람 (0) | 2022.11.28 |
---|---|
[Kotlin] 백준 1920 : 수 찾기 (0) | 2022.11.26 |
[Kotlin] 백준 4673 : 셀프 넘버 (1) | 2022.11.25 |
[Kotlin] 백준 1064 : 평행사변형 (0) | 2022.11.24 |
[Kotlin] 백준 1010 : 다리 놓기 (1) | 2022.11.24 |
댓글