은민이는 4와 7을 좋아하고, 나머지 숫자는 싫어한다. 금민수는 어떤 수가 4와 7로만 이루어진 수를 말한다.
A와 B가 주어졌을 때, A보다 크거나 같고, B보다 작거나 같은 자연수 중에 금민수인 것의 개수를 출력하는 프로그램을 작성하시오.
첫째 줄에 A와 B가 주어진다. A는 1보다 크거나 같고, 1,000,000,000보다 작거나 같은 자연수이다. B는 A보다 크거나 같고, 1,000,000,000보다 작거나 같은 자연수이다.
첫째 줄에 A보다 크거나 같고, B보다 작거나 같은 자연수 중에 금민수인 것의 개수를 출력한다.
1 10
2
11 20
0
74 77
2
1000000 5000000
64
import sys
from itertools import product
input = sys.stdin.readline
a, b = map(int, input().split())
x = len(str(a))
y = len(str(b))
cnt = 0
for i in range(x, y+1):
lst = list(product([4, 7], repeat=i))
for num in lst:
n = int(''.join(map(str, num)))
if a <= n <= b:
cnt += 1
print(cnt)
4와 7로만 이루어진 수(이하 4-7수)는 itertools.product를 이용해 구할 수 있다. 한 자리 수를 얻고 싶으면 repeat을 1로, 두 자리 수를 얻고 싶으면 repeat을 2로 지정한다.
print(list(product([4, 7], repeat=1)))
print(list(product([4, 7], repeat=2)))
print(list(product([4, 7], repeat=3)))
# [(4,), (7,)]
# [(4, 4), (4, 7), (7, 4), (7, 7)]
# [(4, 4, 4), (4, 4, 7), (4, 7, 4), (4, 7, 7), (7, 4, 4), (7, 4, 7), (7, 7, 4), (7, 7, 7)]
(4, 4) 형태를 정수로 바꾸는 건 int(''.join(map(str, (4, 4))))
를 통해 달성한다.
그럼 이제 수의 범위만 a 이상 b 이하로 좁혀주면 답을 낼 수 있다.
4-7수를 자리 수
를 통해 구하고 있으므로 a와 b의 자리 수
를 구한다.
x = len(str(a))
y = len(str(b))
a=100, b=10000이라고 한다면 x=3, y=5가 될 것이다. 세 자리의 4-7수, 네 자리의 4-7수, 다섯 자리의 4-7수를 모두 구한 후 그 중 a 이상이고 b 이하인 수를 발견했을 때만 카운트를 올려준다.
for i in range(x, y+1):
lst = list(product([4, 7], repeat=i))
for num in lst:
n = int(''.join(map(str, num)))
if a <= n <= b:
cnt += 1