본문 바로가기
  • 개발하는 곰돌이
Algorithm/BOJ

[Kotlin] 백준 1065 : 한수

by 개발하는 곰돌이 2022. 11. 25.

문제 링크

 

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

댓글