[python] 백준 1065 : 한수

728x90

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

 

1065번: 한수

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

www.acmicpc.net

난이도 : 실버4

분류 : 브루트포스


코드

def han(N):
    cnt = 0
    for i in range(1, N+1):
        lst = []
        for j in str(i):
            lst.append(int(j))
        if sum(lst)/len(lst) == (lst[0] + lst[len(lst)-1]) / 2:
            cnt += 1
        else:
            continue
    return cnt

N = int(input())
print(han(N))

풀이

숫자 N을 입력받는다.

N의 각 자리수가 등차수열일때 N을 한수라고 한다.

1~N까지의 숫자중에서 한수의 개수를 출력해야 한다.

 

다음과 같이 연속된 두개의 수의 차가 일정한 수열을 등차수열이라고 한다.

1, 3, 5, 7

2, 4, 6, 8

 

등차수열의 평균값은 수열의 맨 처음과 끝의 합에서 2를 나눈 값과 같다.

1, 3, 5, 7 -> 평균 : (1+3+5+7)/4 = 1+7 / 2 = 4

 

def han(N):
    cnt = 0
    for i in range(1, N+1):
        lst = []
        for j in str(i):
            lst.append(int(j))

매개변수로 받은 N을 반복문의 범위로 쓴다. 1~N까지 각각의 값을 i라 할 때,

i의 각 자리수를 구분하기 위해 for j in str(i)을 사용했다.

예를들어 i가 123이라면 123을 str로 형변환할 때 j는 반복문을 돌면서 '1', '2', '3'이 된다.

다시 각 자리수를 int로 형변환 하여 lst 리스트에 담는다.

 

         if sum(lst)/len(lst) == (lst[0] + lst[len(lst)-1]) / 2:
            cnt += 1
         else:
            continue
     return cnt

lst = [1, 2, 3]이라면 len(lst) = 3이므로, sum(lst)/len(lst)로 lst 원소들의 평균을 구한다.

lst[0]과 lst[len(lst)-1]로 lst리스트의 맨 처음과 맨 마지막 원소의 합을 구하고 2로 나눈다.

 

등차수열의 평균값은 수열의 맨 처음과 끝의 합에서 2를 나눈 값과 같다.

123은 각 자리수가 등차수열인 한수에 해당하므로 cnt의 값을 1씩 올려준다.

 

조건에 해당하지 않으면 i값을 증가시키고 다시 반복문을 진행한다.

반복문을 완전히 빠져나오면 cnt를 반환하도록 한다.

728x90