새소식

백준 알고리즘

백준 문제풀기 [#1065번] - 한수 문제

  • -

문제 

예제 

 

등차수열: 두 항의 차이가 모두 일정한 수열을 뜻한다.

예를 들어 1, 3, 5, 7, 9, ...은 등차수열이다. 이때 두 항의 차이는 이 수열의 모든 연속하는 두 항들에 대해서 공통으로 나타나는 차이므로, 공차라고 한다.

예를 들어, 앞의 수열의 공차는 2이다.

 

문제에서는 양의 정수 X의 각 자리가 등차수열을 이룬다면 이 수를 한수라고 하였다. 

예를 들면 123은 각 자리수의 차가 1씩 나고, 147은 각 자리수의 차가 3씩 난다. 이 처럼 각 자리수의 차이가 공통적인 수를 한수라고 한다. 

 

이때 N의 수는 1부터 1000까지의 숫자로 되어있다. 

 

문제를 풀 때 나는 경우의 수를 3가지로 나누어 풀었다. 

N이 1~99인 경우, 각 자리수 차이를 비교할 수 없어 모든 수가 한수에 속한다. 

(예를 들어, 97인 경우 각 자리수의 차이는 2이다. 하지만 두 자리수이므로 비교할 대상이 없다. 따라서 1~99 모든 수가 한수에 속하게 된다. )

N이 100~999인 경우, 각 자리수를 비교해야한다. 

이 경우에는 숫자의 일의 자리, 십의 자리, 백의 자리를 잘라 일의 자리- 십의 자리 == 십의 자리- 백의 자리 가 같은 경우에만 count를 해주었다. 

N이 1000인 경우에는,  자리수가 4자리로 늘어나게 된다. 

 하지만 4자리수인 경우는 1000뿐이다. 1000은 한수가 될 수 없으므로 N= 999로 두어 풀었다. 

 

<첫 번째로 구현한 코드> - 출력 초과 

# 1065
n = int(input())
count = 0
a = []

def hansu(n):
    count = 99
    for i in range(100, n + 1):
        for j in str(i):
            a.append(j)
        data_a = list(map(int, a))
        
        if data_a[0] - data_a[1] == data_a[1] - data_a[2]:
            count += 1
            
        data_a.clear()
        a.clear()
    return count

if n < 100:
    count = n
    print(count)
elif 100 <= n <= 999:
    hansu(n)
elif n == 1000:
    n = 999
    hansu(n)

코드는 출력초과 결과가 떴다. 

 

..그렇다고 한다. 

 

좀 더 간결하게 코드를 짜야하겠다고 생각하였다. 

def hansu(n):
    count = 0
    for i in range(1, n + 1):
        a = list(map(int, str(i)))
        print(a)
        if i < 100:
            count += 1
        elif a[0] - a[1] == a[1] - a[2]:
            count += 1
    return count

n = int(input())
print(hansu(n))

같은 코드이지만 훨씬 간결하게 짜여졌다. 

 

코드를 간결하게 짜는 연습을 더 해야할 것 같다. 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.