파이썬 python 한수 [BOJ 1065]
1065번: 한수
어떤 양의 정수 X의 자리수가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오.
www.acmicpc.net
주어진 자연수보다 작은 한수를 구하기 위해 우선 한수인지 판별하는 함수를 만들었습니다.
- 한수 판별 함수 만들기
def is_han(num):
if num < 100:
return True
else:
rawlist = [int(i) for i in str(num)]
templist = [rawlist[j]-rawlist[j-1] for j in range(1, len(rawlist))]
index = 1
while index < len(templist):
if templist[index] != templist[index - 1]:
return False
index += 1
return True
우선 일의 자리와 십의 자리의 경우 모두 한수로 볼 수 있기 때문에 100보다 작은 값에 대해서는 True를 리턴합니다. 그보다 큰 수의 경우, 각 자리수의 차이를 다시 리스트에 넣었습니다. (templist)
- 원래 인자로 들어온 숫자의 자리수가 n이라면, 새로 만든 리스트의 개수는 n-1입니다.
그 후 새로 만든 리스트인 templist에서 서로 인접한 두 수의 값을 비교했습니다. 이때 비교한 두 수의 값이 같아야 등차수열이 될 수 있습니다. 또한 index가 1부터 시작하고 index < len(templist)인 것을 볼 수 있는데 이는 만들어진 templist 내부에서 두 요소를 비교하기 때문입니다.
- 새로 만든 리스트 templist의 개수가 n-1이라면, 비교 횟수는 n-2입니다. (두 수를 비교하는 것이므로)
- 한수의 개수 구하기
N = int(input())
idx = 1
num = 0
while idx <= N:
if is_han(idx) == True:
num += 1
idx += 1
print(num)
1이상 N이하의 자연수 중 위에서 만든 is_han함수를 사용하여 참인 값만 따로 개수를 세어줍니다.
전체 코드
def is_han(num):
if num < 100:
return True
else:
rawlist = [int(i) for i in str(num)]
templist = [rawlist[j]-rawlist[j-1] for j in range(1, len(rawlist))]
index = 1
while index < len(templist):
if templist[index] != templist[index - 1]:
return False
index += 1
return True
N = int(input())
idx = 1
num = 0
while idx <= N:
if is_han(idx) == True:
num += 1
idx += 1
print(num)
'알고리즘 문제풀이 (파이썬) > BOJ (Baekjoon Online Judge)' 카테고리의 다른 글
함수 활용 [BOJ 1316] 그룹 단어 체커 (파이썬 python) (0) | 2020.01.23 |
---|---|
특정 조건 안에서 문자열 개수 세기 [BOJ 2941] 크로아티아 알파벳 (파이썬 python) (0) | 2020.01.22 |
파이썬 입력이 끝날 때까지 받아오는 방법 [BOJ 10951] A+B - 4 (파이썬 python EOF EOFError) (0) | 2020.01.17 |