한수라는 것은 어떤 양의 정수 x의 각 자리가 등차수열을 이룬다면, 그 수를 의미한다.
문제는 정수 n이 주어졌을 때 1~n 사이의 한수의 개수를 출력하는 것이다.
먼저 풀이는 다음과 같다.
def han(n):
result = 0
for i in range(1, n + 1):
tmp = list(map(int, str(i))) # 정수 i를 자릿수별로 추출하여 리스트 담기 ex) [1,2,3]
chk = diff = 0
if i < 100: # 1~99까지는 무조건 한수이므로 갯수+1
result += 1
else: # zip으로 리스트 안의 각 자릿수와 바로 다음자릿수 간의 차이 비교
for index, (a, b) in enumerate(zip(tmp, tmp[1:])):
if index == 0:
diff = b-a
if diff != (b-a): # 자릿수간 차이가 다르면 chk변수 +1
chk += 1
if chk == 0: # 자릿수간 비교 등차수열이었을 경우에만 한수 갯수+1
result += 1
return result
num = int(input())
print(han(num))
그리고 다른분들 풀이 참고해서 다른 방식으로도 풀어봤다.
def han(n):
result = 0
for i in range(1, n + 1):
tmp = list(map(int, str(i))) # 자릿수별 분리해서 list 담기
if i < 100: # 1~99까지는 무조건 한수
result += 1
else: # 1000은 한수 아니니까 100~999까지 3자리 수만 체크하면 됨
if tmp[1]*2 == tmp[0] + tmp[2]:
result += 1
return result
print(han(int(input())))
애초에 1~99까지는 무조건 한수이고, 1000은 한수가 아니므로 100~999까지의 3자리수만 체크하면 된다는 것을 고려하면 좀 더 간단한 풀이가 되었다.
이 문제는 한수 개념 자체가 이해가 안돼서 이걸 찾아보는 게 제일 오래 걸렸던 것 같다.
계속 이해가 안가서 여기 저기 찾아보다가, 확 이해시켜준 글이 있어서 첨부한다.
'코딩테스트 연습' 카테고리의 다른 글
[백준] 11720번 - 숫자의 합 (PYTHON) (0) | 2022.12.12 |
---|---|
[백준] 11655번 - 아스키 코드 (PYTHON) (0) | 2022.12.12 |
[백준] 4673번 - 셀프 넘버 (PYTHON) (0) | 2022.12.12 |
[백준] 15596번 - 정수 N개의 합 (PYTHON) (0) | 2022.12.11 |
[백준] 8958번 - OX퀴즈 (JAVA) (0) | 2022.02.07 |