AngelPlayer`s Diary

링크

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

 

1065번: 한수

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

www.acmicpc.net

 

 

 

문제 해석

숫자가 있을 때, 숫자를 자리수마다 모두 쪼개어 모든 자리수가 등차를 이루면(공차가 동일하면) 한수라고 한다.

 

ex) 123

123은 자리수에 따라 1, 2, 3 으로 나눌 수 있고, 1과 2는 1만큼 차이가 나며(공차), 2와 3 역시 1만큼 차이가 나기(공차) 때문에 등차를 이루며, 모든 자리수가 일정한 공차를 성립하기 때문에 한수이다.

 

1~9까지는 길이가 1인 등차수열이기 때문에 한수이고,

10~99까지는 길이가 2이고 한 가지 공차를 가지며, 이것을 공차가 일정하다고도 볼 수 있기 때문에 한수이다.

-> 1~99까지는 모두 한수이다.

 

이때 자연수 1~1000까지 중 임의의 숫자를 입력했을 때 입력 값의 범위까지의 한수 개수를 구하는 코드를 구현하는 것이 목표이다.

 

 

 

코드

max_num = int(input())
hansu_count = 0

for i in range(1, max_num+1):
	if i < 100: # 100보다 작은 경우 모두 한수
		hansu_count += 1
	else:
		i = str(i)
		gongcha = -99
		for j in range(len(i)-1):
			if j == 0: # 첫 번째 비교라면
				gongcha = int(i[j]) - int(i[j+1])
				continue
			elif j == int(len(i)-2): # 마지막 비교라면
				if gongcha == int(i[j]) - int(i[j+1]):
					hansu_count += 1
					break
			else: # 중간 비교라면
				if gongcha != int(i[j]) - int(i[j+1]):
					break
	

print(hansu_count)

 

 

 

코드해석

input 값을 최대 숫자로 인식하고 for문을 통해 input 값만큼 반복한다.

우선 사전 문제 해석에서 100이하는 모두 한수임을 알 수 있었기 때문에, 100보다 작은 값은 한수로 취급하여 한수 개수 count를 증가시켜준다.

 

100보다 큰 값이 들어오는 경우 해당 값의 자릿수-1만큼 반복하며,

1) 첫 번째 비교인 경우 첫 번째 자리의 값과 두 번째 자리의 값의 공차를 gongcha 변수에 넣는다.

2) 마지막 비교(자릿수-1)인 경우 마지막 자리-1의 값과 마지막 자리의 값의 공차가 gongcha와 동일한 경우 한수 count를 증가시킨다.

3) 중간 자리의 비교인 경우 기존 gongcha와 해당 자리의 공차를 비교한 값이 다른 경우 해당 숫자의 비교를 끝낸다.

-> 예제에서 1~1000까지만을 비교로 넣었기에 3번 대신 1000인 경우 break와 같은 방식으로 2번과 3번을 더 간편하게 만들 수 있었으나, 자릿수가 4자리 이상인 경우에도 사용가능하도록 만들었다.

 

 

 

발생한 문제 & 해결 방안

            ...
            elif j == len(i)-1: # 마지막 비교라면
                if gongcha == int(i[j]) - int(i[j+1]):
                    hansu_count += 1
                    break
                    ...

마지막 자리수 앞의 비교이기 때문에 elif의 조건(마지막 연산)을 len(i)-1로 주었다.

(int(i[j]) - int(i[j+1]) 와 같은 형태로 공차를 비교하는데, 이때 마지막 자리까지 비교한다면 int(i[j+1])은 에러가 뜰 것이기 때문에)

 

문제는 len으로 문자열의 길이를 구하면 문자열의 개수만큼 수가 나오며, (ex. len('123')은 3이 출력) 그대로 조건에 이용하면 자리수가 올바르지 않게 되기 때문에 -1을 할 필요가 있다.

 

따라서 elif의 조건은 len(i)-2가 되었어야 한다.

 

 

 

 

 

 

 

해당 코드는 에디터가 코드 연습을 위해 직접 작성하였습니다.

혹시 오류가 있거나 더 좋은 코드 방향성을 아시는 분은 댓글로 남겨주시면 감사하겠습니다..!

공유하기

facebook twitter kakaoTalk kakaostory naver band