규도자 개발 블로그

[백준/1065/파이썬3(python3)] 한수 본문

알고리즘/풀이

[백준/1065/파이썬3(python3)] 한수

규도자 (gyudoza) 2019. 2. 18. 19:52

[백준/1065/파이썬] 한수

문제

어떤 양의 정수 X의 자리수가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오.

입력

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

출력

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

입출력 예

입력출력
11099

풀이

def arithmetic_checker(input_number):
    result = False
    number_list = [int(i) for i in [*str(input_number)]]
    if len(number_list) < 3:
        result = True
    else:
        first_common_difference = number_list[1] - number_list[0]
        for i in range(0, len(number_list) - 1):
            common_difference = number_list[i + 1] - number_list[i]
            if first_common_difference != common_difference:
                result = False
                break
            else:
                result = True
    return result


arithmetic_count = 0
input_number = int(input())
for i in range(1, input_number + 1):
    arithmetic_count += arithmetic_checker(i)

print(arithmetic_count)

설명

처음에는 이 한수라는 개념을 잘 이해하지 못해서 어려웠지만 다른 사람이 써놓은 설명을 보고서 쉽게 풀 수 있었다. "어떤 양의 정수 X의 자리수가 등차수열을 이룬다"는 표현이 모호했기 때문이었는데 알고보니 간단했다. 그냥 주어진 자연수에서 각 자리수가 등차수열을 이루면 한수라는 말이다. 왜 같은말을 반복할까 하겠지만 이것이 표현하기 가장 간단한 방법이기 때문이다. 이 한수의 개념은 예제를 보면 확 와닿는다.

일단 등차수열이라는 건 동일한 차수를 가진 수열을 말한다. 차수라는 것은 숫자와 숫자의 차이이다.

예를 들자면 123은 한수이다. 123은 1, 2, 3으로 나누어지며 1과2는 1의 차수를 갖고 있고 2과 3은 1의 차수를 갖고 있으므로 등차수열이 되는 것이다. 111도 0이라는 공차를 가진 한수이며 321도 -1이라는 공차를 가진 한수이다. 이 한수문제에서 특이한 건 한자리수와 두자리수를 가진 숫자들인데 이를 모두 참으로(한수로) 친다. 한수의 학문적인 개념을 몰라서 이게 허용되는 건지 모르겠지만 아무튼 뭐... 그런갑다.

원래는 주어진 공차와 남은 수열을 매개변수로 갖는 재귀를 통해서 구현하려고 해봤지만... 아직은 재귀함수를 능수능란하게 다룰 정도는 아닌 것 같다. 해서 3자리수 이하의 입력은 전부 참으로 치고 3자리 이상의 숫자부터 한수인지 검사하는 함수를 만들어 해결하였다.

Comments