조금씩 꾸준히 완성을 향해

[Algorithm] 백준 1065 한수 with Python 본문

DataStructure & Algorithm/문제풀이

[Algorithm] 백준 1065 한수 with Python

all_sound 2022. 9. 22. 21:49

문제

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

입력

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

출력

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

예제 입력 1 

110

예제 출력 1 

99

 


내가 짠 코드

n = int(input())

def func(n):  
    cnt = 0
    for i in range(1, n+1):
        if i >= 100:
            a1 = i %10  #셋째 자리수
            i = i // 10
            a2 = i % 10  #둘째 자리수
            a3 = i // 10   #첫째 자리수
            if a3 - a2 == a2 - a1 :  #등차수열 확인
                cnt += 1
        else:    # 일의 자리부터 십의 자리 숫자까지는 무조건 한수
            cnt += 1
    return cnt
print(func(n))

자리수를 구할 때 숫자를 문자열로 바꾸면 더 쉽게 구현이 가능하다는 걸 알았지만, 최대한 숫자 그대로 짜보려고 노력했다. 덕분에 조건문이 중첩되고 코드도 길어졌지만 성공은 했다.

일단 일의 자리부터 십의 자리수까지는 무조건 한수이기 때문에 카운팅을 해주었다. 100의 자리일 경우에는 몫과 나머지 개념을 이용해서 자리수를 잘라서 각각 변수에 저장을 했다. 그리고 그게 등차수열인지 확인한 후 맞으면 카운팅을 해주었다. 

 

 

다른 코드 참고

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

보다시피 이 방법으로 하면 훨씬 짧고 간단하다. 

숫자를 문자열로 바꾸고, 그걸 다시 정수로  maping 한 후 list에 넣으면 아주 쉽게 자리수가 저장된다.

마찬가지로 100 미만의 숫자들은 다 카운팅 해주고, 100 이상인 경우에 등차수열인지 확인을 한 후 카운팅한다. 

 

다양한 데이터 타입 매핑 방법을 잘 기억해 놓아야겠다. 

 

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

 

1065번: 한수

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

www.acmicpc.net