2018-12에 적용된 피보나치 벌금 제도 하에서 개이득 구간 보기

TIL 모임에서 12월에는 결석일수에 따른 벌금제도에 피보나치 수를 적용하기로 했다. n번째 결석일의 벌금이 피보나치 수 규칙에 따라 증가하는 것이다. 그렇다면 결석일수에 따른 월 총 벌금액은 기존의 하루 1000원으로 고정된 벌금제도와 비교해서 어느 구간이 개이득 인지 궁금해져서 찾아봄.

fib(n) = fib(n-1) + fib(n-2)
f(0)=0, f(1)=100 으로 정의
결석일이 n일 일경우 12월 총 벌금액 :  \sum{i=1}^{n} fib(i)

피보나치 함수 구현은 로제타 코드에 있는 버전을 가져다 씀.

코드



#https://rosettacode.org/wiki/Fibonacci_sequence#Recursive_with_Memoization_4 가져다 고쳐씀.

fib_fine = Hash.new do |f, n|
  f[n] = if n == 0
           0
         elsif n == 1
           n * 100
         else
           f[n - 1] + f[n - 2]
         end
end

accumulated_fib_fine = Hash.new do |f,n|
  f[n] = (1..n).sum{|x| fib_fine[x] }
end

def filter_max_for_fibo(x)
  if x > 50000
    50000
  else
    x
  end
end

accumulated_fixed_fine = Hash.new do |f,n|
  f[n] = n*1000
end


puts "결석일\tacc_fixed\tacc_fibo\tacc_fibo_filtered\t구간"
(1..31).each do |n|
    fib_original_sum = accumulated_fib_fine[n]
    fib_filtered_sum = filter_max_for_fibo accumulated_fib_fine[n]
    fixed_sum = accumulated_fixed_fine[n]
    msg = if fib_original_sum < fixed_sum then "개이득" else "노이득" end
    printf "#{n}\t%12s\t%12s\t%12s\t#{msg}\n" , fixed_sum, fib_original_sum, fib_filtered_sum
end

결과

결석일 acc_fixed   acc_fibo    acc_fibo_filtered   구간
1           1000             100             100    개이득
2           2000             200             200    개이득
3           3000             400             400    개이득
4           4000             700             700    개이득
5           5000            1200            1200    개이득
6           6000            2000            2000    개이득
7           7000            3300            3300    개이득
8           8000            5400            5400    개이득
9           9000            8800            8800    개이득
10         10000           14300           14300    노이득
11         11000           23200           23200    노이득
12         12000           37600           37600    노이득
13         13000           60900           50000    노이득
14         14000           98600           50000    노이득
15         15000          159600           50000    노이득
16         16000          258300           50000    노이득
17         17000          418000           50000    노이득
18         18000          676400           50000    노이득
19         19000         1094500           50000    노이득
20         20000         1771000           50000    노이득
21         21000         2865600           50000    노이득
22         22000         4636700           50000    노이득
23         23000         7502400           50000    노이득
24         24000        12139200           50000    노이득
25         25000        19641700           50000    노이득
26         26000        31781000           50000    노이득
27         27000        51422800           50000    노이득
28         28000        83203900           50000    노이득
29         29000       134626800           50000    노이득
30         30000       217830800           50000    노이득
31         31000       352457700           50000    노이득