백준) 1065 - 한수

한수

문제 '한수'의 링크를 아래에 달아두었습니다.

풀이


전형적인 브루트 포스 문제입니다.
브루트 포스란 모든 경우의 수를 따져보고 결과값을 도출하는 알고리즘 입니다.



여기서는 특정 범위에서 자리수가 등차수열을 이루는 값들을 모두 찾아야 했습니다.
메커니즘은 다음과 같습니다.




자리수는 10으로 나눴을 때의 몫과 나머지를 통해 표현했고, 각 값을 리스트에 넣은 후, 초기 체크 값을 리스트 0번째, 1번째 자리의 차이로 만들었습니다.




그리고 반복문을 사용하여 다음 순서의 차이를 구한 후 체크 값과 비교하는 방식으로 등차 수열임을 판단했습니다. 코드는 다음과 같습니다.







n = int(input()) #최대 범위의 값 입력

cnt = 0

#1부터 n까지의 자연수 들 중에서 '한수' 탐색
for x in range(1, n+1):
    if x == 1: #1이면 그냥 넘긴다
        cnt += 1
        continue
        
    ls = []
    #10의 몫과 나머지를 구하는 방식으로 자리수 구분.
    while x>=1:
        ls.append(x % 10)
        x = int(x/10)
    #자리수가 1개 혹은 2개 일 경우 등차수열인지 판단 불가. 여기서는 모두 카운팅했다.
    if len(ls) == 1 or len(ls) == 2:
        cnt += 1
    else:
        chk = ls[1] - ls[0] #기준 체크 값 산출
        flag = 0
        for i in range(2, len(ls)):
            if chk != (ls[i] - ls[i-1]): #해당 시점의 자리수와 이전 시점의 자리수를 뺀 뒤, 기준 값과 비교한다.
                flag = 1 #다를 경우 플래그를 걸어둠
                break
        if flag == 0: #모든 값이 기준 값과 동일(등차 수열을 이룬다)할 경우 카운팅.
            cnt += 1
            
print(cnt)

댓글