쿠폰
난이도
Gold 5
인증
문제
신기한 마이마이의 치킨박스 하나를 사면 1부터 N까지의 숫자 중 하나가 적힌 쿠폰 한 개를 준다.
해빈이는 골드치즈치킨을 매우 좋아한다. 1부터 N까지의 쿠폰들을 모두 모아야 골드치즈치킨 하나를 주문할 수 있다고 할 때, 해빈이는 신기한 마이마이의 치킨박스를 평균적으로 얼마나 많이 주문해야 하는가?
입력
쿠폰에 적힐 숫자의 범위(1 ≤ N ≤ 22)가 여러 줄에 걸쳐서 주어진다.
출력
각 입력에 대해 해빈이가 주문해야할 치킨박스의 수를 출력한다. 만약 답이 정수라면 그대로 출력한다. 답이 정수가 아니라면 정수부분을 출력하고, 공백하나를 출력한 다음, 아래에 보인 형식대로 적절히 정수를 뺀 나머지 값을 기약분수를 출력한다. 불필요한 공백은 출력하지 않는다.
예제 입력
2
5
17
예제 출력
3
5
11 --
12
340463
58 ------
720720
해설 및 후기
통계적 수식을 사용해야 한다. 이와 같은 상황에서 평균적으로 주문해야 하는 횟수는 n*(1/n + 1/(n-1) … + 1/1)로 구할 수 있다. 때문에 이를 기약분수로 변환하는 것이 중요한데, GCD를 사용해 구한 분자와 분모를 나누어 기약분수 꼴로 만들어낼 수 있었다.
제출 코드
from math import gcd
def printAns(n):
d = 1
for i in range(2,n+1):
d *= i
t = 0
for i in range(1,n+1):
t += d//i
t *= n
c = gcd(t,d)
d = d//c
t = t//c
if(t%d == 0):
print(t//d)
else:
if(t//d < 10):
print(" "+str(t%d))
print(str(t//d)+" ",end='')
for i in range(len(str(d))):
print('-',end='')
print()
print(" ",str(d))
else:
print(" "+str(t%d))
print(str(t//d)+" ",end='')
for i in range(len(str(d))):
print('-',end='')
print()
print(" ",str(d))
while(True):
try:
n = int(input())
printAns(n)
except:
break