본문 바로가기

알고리즘

[ 알고리즘 / kotlin ] 백준 1065 한수

안녕하세요 gyub(귭)입니다 ㅎㅎㅎ

이번엔 백준 알고리즘 1065번 한수 문제입니다.

 

https://www.acmicpc.net/problem/1065

 

1065번: 한수

어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 ��

www.acmicpc.net

문제를 요약하자면 주어지는 수의 각 자리 숫자가 등차수열을 이루는 수의 개수를 구하는 문제입니다!

 

(아 참고로 이 문제는 브루트포스(완전탐색)으로 푸시면 됩니다유)

코드를 보여드리기 앞서 접근 방식에 대해 설명하겠습니다 ^~^

 

등차수열이라고 했으니 각 자리의 수의 차가 같을겁니다!

그렇다면 앞의 두 수의 차가 고대로 쭉쭉쭉쭉 다른 연속된 두 수의 차와도 같겠져?

 

예로 4321이 주어졌다고 칩시다

 

4 와 3의 차이는 1이죠!

만약 4321이 '한수'라면 뒤에 나오는 연속된 두 수의 차도 1일겁니다!!

물론 우리는 4321을 보고 바로 아 한수 맞네 라고 생각할 수 있지만 컴퓨터는 그러지 못해요 ㅠ

그럼 다시 문제로 돌아와서 3과 2 , 2와 1 을 탐색해봅시다

3과 2의 차이는 1

2와 1의 차이도 1이네요!!!!

그럼 요게 '한수'가 되어버리는거쥬

이때! 문제에서는 '한수'의 개수를 구하라고 했으니 이때 answer++을 해주면 됩니다

 

주요 코드를 보여드리겠습니다리 (전체 코드는 하단에 깃허브에 올려놨어열)

 for (i in s.toInt() downTo 1) {
        val t = i.toString()
        var isAnswer = true
        if (t.length == 1) {
            answer++
        } else {
            val tmp = t[0].toString().toInt() - t[1].toString().toInt()
            for (j in 0 until t.lastIndex) {
                if (tmp!=t[j].toString().toInt() - t[j+1].toString().toInt())
                 isAnswer= false
            }
            if (isAnswer) answer++
        }
    }

문제를 풀고 다른 분들은 어떻게 풀었나봤는데 % 와 /를 이용하여 각 자리 수를 활용(?)하셨더라구여

근데 저는 문자열 처리가 더 간편해서 요렇게 풀었습니다

 

전체코드입니다 

https://github.com/Songgyubin/Algorithm/blob/master/baekjoon/BOJ_1065.kt

 

 

 

이해가 안 가시는 분봐주셔서 감사합니다!
질문이나 수정되어야 할 부분이 있다면 댓글로 남겨주세요!

 

 

 

 

 

반응형