우당탕탕 파이썬 with 하루하나 알고리즘

백준 1065 파이썬 - 한수의 개수를 구하라!

hyxndy 2022. 4. 3. 00:58

백준 1065번 - 한수 with Python

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

 

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

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

 

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

 

1065번: 한수

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

www.acmicpc.net


처음에 이 문제를 딱 읽었을 때 문제가 잘 이해가 안돼서 당황,,,

근데 뭔가 내 힘으로 풀어보고 싶어서 구글링 안하려고 하다가 

문제에 대한 질문을 누가 백준 질문란에 올려서 이해할 수 있었다!

문제가 잘 이해가 되지 않는다면 요 아래 사이트를 참고하세요!!

https://www.acmicpc.net/board/view/25689

 

문제에서 말했듯이, 각 자리별로 숫자가 등차수열을 이루는 수를 찾아 개수를 세면 된다.

먼저 1~9까지의 자연수는 자리가 한 자리밖에 되지 않기 때문에 이는 등차수열을 이루는 수이다.

10~ 99까지의 자연수는 자리가 두 자리인데, 이 숫자도 무조건 등차수열을 이루게 된다.

그럼 우리가 고려해주어야할 수는 100~999까지의 수이다.

 

이 수가 등차수열인지 확인하려면

(세 번째 자리수)-(두 번째 자리수)와 (두 번째 자리수)-(첫 번째 자리수)의 값이 같으면 된다.

 

위의 내용을 종합해서 컴퓨팅적 사고를 해보자면

1~N까지의 숫자가 있을 때,

1~99까지의 수일 때에는 무조건 +1을 해주고,

 

100 ~ N까지의 수일 때에는 

(세 번째 자리수)-(두 번째 자리수)와 (두 번째 자리수)-(첫 번째 자리수)의 값이 같으면 +1을 해준다.

 

그리고 이 개수를 다 세어준다.

 

이것은 for문과 if,elif문을 활용하여 나타내줄 수 있겠다.

코드는 아래와 같다.

N = int(input())
count = 0
i=1
for i in range(1,N+1):
    k = list(map(int,str(i)))
    if(i<=99):
        count+=1
    elif ((k[2]-k[1])==(k[1]-k[0])):
        count+=1
        
print(count)