Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

개발 블로그

[백준/파이썬] 1065번<한수> 문제 풀이 본문

Algorithm

[백준/파이썬] 1065번<한수> 문제 풀이

토산인 2023. 2. 27. 01:54

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

 

1065번: 한수

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

www.acmicpc.net

문제

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

입력

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

출력

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

 


 

사고 흐름

처음에는 일의 자리랑 십의 자리 등차수열을 어떻게 구해야할까 조금 복잡하게 생각했다

-> 예제를 보고 문제 정확하게 이해했다 (예제로 문제 이해하는게 더 빠를 수도 있겠다, 문제가 애매하면 케이스 보고 이해)

-> 일의 자리와 십의 자리는 무조건 한수가 되고, 백의 자리는 두 자리의 차를 구해야겠다

 

문제 핵심과 알고리즘

n보다 작은 모든 숫자들을 한수인지 체크해야 하므로 완전탐색 문제이다. 

n=int(input())
cnt=0
for i in range(1, n+1) :
    if i//10 == 0 or i//100 == 0 :
        cnt+=1
    else :
        h=i//100
        t=(i%100)//10
        o=(i%100)%10
        if h-t==t-o :
            cnt+=1

print(cnt)

 

문제 풀면서 헤맸던 부분

딱히 없다

 

다른 사람들 풀이 참고하며 배운 점

num = int(input())
hansu = 0

for n in range(1, num+1) :
    if n <= 99 : # 1부터 99까지는 모두 한수
        hansu += 1 
    
    else :     
        nums = list(map(int, str(n))) # 숫자를 자릿수대로 분리 
        if nums[0] - nums[1] == nums[1] - nums[2] : #등차수열 확인
            hansu+=1

나는 100 이상의 숫자는 따로 백의 자리, 십의 자리, 일의 자리로 나눴는데 이 풀이는 숫자를 자릿수대로 분리하기 위해 숫자를 문자열로 바꾸고 다시 int로 바꿔서 list로 넣었다. 숫자를 자릿수대로 분리하는 좋은 방법이다. 

num_list = list(map(int, str(12345)): 12345를 문자열로 만들어 하나씩 int로 만들고 list에 넣기