본문 바로가기

Problem Solving/Baekjoon Online Judge

<함수> 1065번 한수 with 파이썬

 

문제

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

입력

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

출력

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

정답비율

51.163%

 

def solve(N) :
    if N < 100:
        count = N
    elif N < 1000:
        count = 99
        for i in range(100, N + 1):
            hh = i // 100
            tt = (i % 100) // 10
            dd = (i % 100) % 10
            if hh - tt == tt - dd:
                count += 1
            else:
                pass
    elif N == 1000:
        count = 99
        for i in range(100, N):
            hh = i // 100
            tt = (i % 100) // 10
            dd = (i % 100) % 10
            if hh - tt == tt - dd:
                count += 1
            else:
                pass
    print(count)

n = int(input())
solve(n)

 

 100미만의 숫자는 모두 등차수열을 이룰 수 밖에 없기때문에 굳이 계산 없이 자기 자신을 카운팅값으로 출력시켰다. 100이상의 세자리숫자는 리스트로 저장시켜서 카운트 함수를 사용해도 될 것 같았지만 그렇게 하면 100미만의 숫자를 모두 저장시켜야 하므로 비효율적으로 판단된다.

 

 따라서 count라는 변수에 99를 저장하고 100이상의 세자리 숫자에 대해서만 백의자리, 십의자리, 일의자리 차이가 같은 숫자들이 있을 때마다 count변수에 1을 더하도록 하였다.

 

 그러나 문제에서 1000보다 작거나 같은 자연수가 주어진다고 하였는데, 1000이 주어지게 될 경우 천의자리를 판단하는 계산이 불필요하게 추가될 수 있다. 어차피 1000은 등차수열을 이루지 않기 때문에 elif로 별도로 빼서 위에서 진행한 for구문을 999까지 진행하게 하였다.

 

 


 

참고

 

 

1065번: 한수

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

www.acmicpc.net