파이썬(Python)/백준(Baekjoon) 문제 풀이

[백준, python] 1065번 : 한수(함수)

sunning 2022. 3. 21. 14:58
728x90
반응형

백준 1065번 문제 풀기

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

 

1065번: 한수

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

www.acmicpc.net


문제 설명

문제

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

입력

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

출력

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

 

예제 입력 1
예제 출력 1
110 99
예제 입력 2
예제 출력 2
1 1
예제 입력 3
예제 출력 3
210 105
예제 입력 4
예제 출력 4
1000
144
예제 입력 5
예제 출력 5
500
119

알고리즘 및 설명 

처음에 문제를 딱 접하고 문제 자체를 이해하는데 내 머리가 로딩이 걸렸다. 그래서 먼저 한수인지 아닌지를 판별하는 함수를 작성하였다. (함수를 만들지 않고도 해결할 수 있지만 이 단계의 주제가 "함수"였기 때문에 함수를 의도적으로 만들어보았다.)

여기서 가장 큰 나의 궁금증은 그럼 한 자리 수나 두 자리 수는 한수인가 아닌가였다. 근데 예제 입력 2에서 1을 입력했을 때 1을 출력한다는 것을 보고 한 자리 수와 두 자리 수도 한수로 본다는 것을 깨달았다.

 

그래서 HANSU라는 함수를 사용하여 무조건 초기에는 return 값을 True로 설정해두었다. 숫자의 자리 수가 3 이상인 경우만 각 자리 수의 차이가 일정한지를 판별하여 한수인지 아닌지 파악하였다. 자리 수의 차이가 한 번 다르면 다음 자리들을 비교할 필요가 없으므로 if문에 걸리면 return값을 False로 바꾸고 break를 통해 빠져나오도록 설정하였다.

 

입력 값을 HANSU 함수에 넣었을 때 True를 반환하면 한수라는 의미이므로 그 개수를 cnt로 count하여 정답을 도출하였다. 여기서 주의할 점은 1보다 크거나 같고, N보다 작거나 같으므로 1부터 N까지의 값을 체킹해야하기 때문에 for 문의 범위를 1부터 N+1까지로 설정해야한다는 점이다.

 

  • sunning algorithm (함수 활용_ver1)
def HANSU(X):
    NUM = list(str(X))
    anw = True
    if len(NUM) >= 3:
        dif = int(NUM[1]) - int(NUM[0])
        for i in range(2, len(NUM)):
            if int(NUM[i]) - int(NUM[i-1]) != dif:
                anw = False
                break
    return anw

N = int(input())
cnt = 0
for i in range(1,N+1):
    if HANSU(i) == True:
        cnt += 1
print(cnt)

 

이걸 좀 더 간단한 방법으로 바꿀 수 있을지 여러 방법들을 탐색해 본 결과, 자연수 N을 입력값으로 넣었을 때 N 이하의 자연수 중 한수의 개수를 반환하는 함수로 만들 수 있었다. 그걸 구현한 건 아래의 코드이다. 

 

  • sunning algorithm (함수 활용_ver2)
def HANSU2(X):
    cnt = 0
    for num in range(1, X+1):
        if num < 100:
            cnt += 1
        else:
            num = str(num)
            if int(num[1]) - int(num[0]) == int(num[2]) - int(num[1]):
                cnt += 1            
    return cnt

print(HANSU2(int(input())))

 

N이 1부터 1000 사이의 값이므로 1000은 한수가 아니기 때문에 1부터 999까지의 숫자만 검토하면 되고 그 중 세 자리 수만 검토하면 되므로 int(num[1]) - int(num[0]) == int(num[2]) - int(num[1])의 조건을 사용해 ver1보다 for문을 줄여서 구현하였다.

 

습관이 되어 자꾸 무조건 자동화하려고 하는데, 간단하게 구현하는 게 최고인 건가 아직도 고민이다!

728x90
반응형