본문 바로가기

알고리즘 문제풀이 (파이썬)/BOJ (Baekjoon Online Judge)

한수의 개수 구하기 [BOJ 1065] 한수 (파이썬 python)

파이썬 python 한수 [BOJ 1065]

BOJ 1065번: 한수

 

1065번: 한수

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

www.acmicpc.net

주어진 자연수보다 작은 한수를 구하기 위해 우선 한수인지 판별하는 함수를 만들었습니다.

  1. 한수 판별 함수 만들기
def is_han(num):
    if num < 100:
        return True
    else:
        rawlist = [int(i) for i in str(num)]
        templist = [rawlist[j]-rawlist[j-1] for j in range(1, len(rawlist))]
        index = 1
        while index < len(templist):
            if templist[index] != templist[index - 1]:
                return False
            index += 1
        return True

​ 우선 일의 자리와 십의 자리의 경우 모두 한수로 볼 수 있기 때문에 100보다 작은 값에 대해서는 True를 리턴합니다. 그보다 큰 수의 경우, 각 자리수의 차이를 다시 리스트에 넣었습니다. (templist)

  • 원래 인자로 들어온 숫자의 자리수가 n이라면, 새로 만든 리스트의 개수는 n-1입니다.

​ 그 후 새로 만든 리스트인 templist에서 서로 인접한 두 수의 값을 비교했습니다. 이때 비교한 두 수의 값이 같아야 등차수열이 될 수 있습니다. 또한 index가 1부터 시작하고 index < len(templist)인 것을 볼 수 있는데 이는 만들어진 templist 내부에서 두 요소를 비교하기 때문입니다.

  • 새로 만든 리스트 templist의 개수가 n-1이라면, 비교 횟수는 n-2입니다. (두 수를 비교하는 것이므로)

  1. 한수의 개수 구하기
N = int(input())
idx = 1
num = 0
while idx <= N:
    if is_han(idx) == True:
        num += 1
    idx += 1
print(num)

​ 1이상 N이하의 자연수 중 위에서 만든 is_han함수를 사용하여 참인 값만 따로 개수를 세어줍니다.

전체 코드

def is_han(num):
    if num < 100:
        return True
    else:
        rawlist = [int(i) for i in str(num)]
        templist = [rawlist[j]-rawlist[j-1] for j in range(1, len(rawlist))]
        index = 1
        while index < len(templist):
            if templist[index] != templist[index - 1]:
                return False
            index += 1
        return True

N = int(input())
idx = 1
num = 0
while idx <= N:
    if is_han(idx) == True:
        num += 1
    idx += 1
print(num)