| 시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
|---|---|---|---|---|---|
| 2 초 | 128 MB | 155876 | 86485 | 71581 | 55.100% |
문제
어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 1,000보다 작거나 같은 자연수 N이 주어진다.
출력
첫째 줄에 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력한다.
풀이
N = int(input())
if N < 100:
print(N)
else:
if N == 1000:
N -= 1
sum = 99
numList = [0,0,0]
for num in range(100, N+1):
for i in range(3):
numList[i] = num%10
num //= 10
if numList[0] - numList[1] == numList[1] - numList[2]:
sum += 1
print(sum)-
1자리수와 2자리수의 수는 모두 한수 →
if N < 100: print(N) -
1000의 경우 한수가 아니므로 999와 한수의 개수가 같음 →
if N == 1000: N -= 1 -
이 두 조건을 잘 활용하면 3자리 수에 대해서만 추가 로직을 수행하면 됨.
-
3자리 수에 대한 추가 로직
- 1자리수 2자리수의 개수 더해줌. →
sum = 99 - 100부터 각 자리 수를 리스트에 넣고 숫자들 사이에 등차성을 테스트(
if numList[0] - numList[1] == numList[1] - numList[2]) 하면서 sum에 값을 누적(sum += 1)
- 1자리수 2자리수의 개수 더해줌. →
-
추가적으로 뿌듯했던 점!
-
2년 전에 같은 문제를 풀었던 코드 보다 훨씬 깔끔해졌음!!
# 2년전 코드
import sys
def solution():
x = int(sys.stdin.readline().rstrip())
# x: 두자리 이하의 양의정수
if x <= 99:
return(x)
# x가 abc(d)일 때 a(b-1)9(9)까지 탐색
n = 10
result = 99
i = 1
while n < x//(10**i):
d = ((n%10) - (n//10))*i
a_1 = n%10
if a_1+d >= 0 and a_1+d<=9:
result+=1
n += 1
# 자릿수 변화
if n == 100:
n = 10
i += 1
# ab--일때 탐색
a_1 = n%10
d = ((n%10) - (n//10))*i
if a_1+d >= 0 and a_1+d<=9:
x_ = n
for j in range(1,i+1):
d = ((n%10) - (n//10))*j
x_ = x_*(10*j) + (d+a_1)
if x_ <= x:
result += 1
return result
if __name__ == "__main__":
print(solution())Computer #PS