Problem:
Score : 300 points

Problem Statement

To make it difficult to withdraw money, a certain bank allows its customers to withdraw only one of the following amounts in one operation:

1 yen (the currency of Japan)

6 yen, 6^2(=36) yen, 6^3(=216) yen, ...

9 yen, 9^2(=81) yen, 9^3(=729) yen, ...

At least how many operations are required to withdraw exactly N yen in total?

It is not allowed to re-deposit the money you withdrew.

Constraints

1 \leq N \leq 100000

N is an integer.

Input

Input is given from Standard Input in the following format:

N

Output

If at least x operations are required to withdraw exactly N yen in total, print x.

Sample Input 1

127

Sample Output 1

4

By withdrawing 1 yen, 9 yen, 36(=6^2) yen and 81(=9^2) yen, we can withdraw 127 yen in four operations.

Sample Input 2

3

Sample Output 2

3

By withdrawing 1 yen three times, we can withdraw 3 yen in three operations.

Sample Input 3

44852

Sample Output 3

16

Solution in Rust (1.15.1) (judge verdict: Accepted)

use std::cmp;
use std::io::Read;

fn main() {
    let mut buf = String::new();

    // 標準入力から全部bufに読み込む
    std::io::stdin().read_to_string(&mut buf).unwrap();

    // 行ごとのiterが取れる
    let mut iter = buf.split_whitespace();
    let amount: u32 = iter.next().unwrap().parse().unwrap();
    // Nの最大値 + 1こ作っとく
    let mut dp: Vec<u32> = vec![amount; 100001 as usize];
    dp[0] = 0;

    for n in 1..(amount + 1) {
        let n = n as usize;
        dp[n] = cmp::min(dp[n], dp[n - 1] + 1);

        // その要素番号(金額)までの最小手を求めて現在のdp[n]より小さければそちらを採用する
        fill_min_step_to_dp(&mut dp, 6, n);
        fill_min_step_to_dp(&mut dp, 9, n);
    }
    println!("{}", dp[amount as usize]);
}

fn fill_min_step_to_dp(dp: &mut Vec<u32>, coin: u32, n: usize) {
    for j in 1..n {
        if n as u32 >= coin.pow(j as u32) {
            dp[n] = cmp::min(dp[n], dp[n - coin.pow(j as u32) as usize] + 1);
        } else {
            break;
        }
    }
}