[알고리즘] 백준 1065 : 한수

김승덕·2022년 9월 25일
0

알고리즘

목록 보기
2/3
post-thumbnail

백준 1065 : 한수

문제

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

입력

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

출력

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

예제 입력 1

110

예제 출력 1

99

예제 입력 2

1

예제 출력 2

1

예제 입력 3

210

예제 출력 3

105

예제 입력 4

1000

예제 출력 4

144

예제 입력 5

500

예제 출력 5

119

내 풀이

import sys

num = sys.stdin.readline()

# 3자리 이상의 수의 한수를 구하는 함수
# 파라미터는 문자열로 받을것(각 문자를 나눠서 배열로 만들기 위해)
def isHansoo(num):
    numArr = list(map(int,list(num)))
    if numArr[1]*2 == numArr[0]+numArr[2]:
        return True
    else:
        return False

# print(list(range(100,100+1)))
# print(list(str(100)))

if int(num) < 100:
    answer = int(num)
    print(answer)
elif int(num) >= 100:
    count = 0
    for i in range(100, int(num)+1):
        if(isHansoo(str(i))):
            count += 1
    print(count + 99)

한수는 각 자리수를 나누어 생각했을때 등차수열이 되면 된다.

2자리수까지 즉 100미만의 수는 무조건 한수가 된다.

비교할 요소가 없기 때문이다.

그렇다면 3자리수일때 어떻게 확인할 지를 생각해야한는데 내가 생각한 방법은 아래와 같다.

3자리 수를 ABC라고 가정한다면 A-B = B-C이면 등차수열이 되는것이다.

이 식을 정리하여 2B = A + C라는 식이 나온다.

먼저 이 식을 활용하여 한수인지 확인할 수 있는 함수를 만들었다.

함수를 통해 10의 자리수 * 2 = 100의 자리수 + 1의 자리수 를 판별하였고 이를 참과 거짓으로 반환하였다.

이제 이 함수를 이용할 차례이다.

if문을 통해 100미만의 수는 무조건 한수이므로 그 수를 그대로 반환하게 했고

그렇지 않다면 한수를 구하는 함수를 for문에 돌려서 몇개인지 확인했다.

그리고 100이상이라면 무조건 99개(1~99)는 한수이므로 이 값도 더해주었다.

profile
오히려 좋아 😎

0개의 댓글