#include
int d[1000001];
using namespace std;
// 1ë¡ ë§ë¤ê¸°
// Nì 1ë¡ ë§ëë **ìµì** ì°ì° íì
// 3ì¼ë¡ ëëë ê²ì´ ë¹ ë¥´ë¯ë¡, 2ë³´ë¤ 3ì 먼ì ëëë¤. -- 그리ë ìê³ ë¦¬ì¦. ìì¸.
// ** ì íìì ì ì를 ì¸ìë³´ì **
// D[N] : Nì ìê² ë§ë¤ ì ìë ë°©ë²
// í°ë¬¸ì ë¨ê³ì ëë¨¸ì§ ë¤ì ì ì²´ 문ì ë¡ ëëë©´ ì¢ë¤.
// N -> N/3 (1ë²) ê³¼ N/3 -> 1 (D[N/3])
// N -> N/2 (1ë²) ê³¼ N/2 -> 1 (D[N/2])
// N -> N-1 (1ë²) ê³¼ N-1 -> 1 (D[N-1])
// D[N] = min(D[N/3], D[N/2], D[N-1])
// D[1] = 0 // 1->1
//--------- TOP DOWN ----------//
// nììë¶í° ë´ë ¤ê°ë©´ì.. ì¬ê·í¸ì¶
int go(int n)
{
if (n == 1)
return 0;
if (d[n] > 0)
return d[n]; // memoization 기ìµíê³ ìë ê±´ ê·¸ëë¡ ì¬ì©
// D[n-1] : **ì무ëë** ê°ë¥í¨ì¼ë¡, ì무ëë 를 먼ì í´ì, **ë¹êµì 기ì¤**ì¼ë¡ ë§ë¤ì´ì¤ë¤.
d[n] = go(n - 1) + 1;
// D[n/2]
if (n % 2 == 0)
{
int temp = go(n / 2) + 1;
if (d[n] > temp)
d[n] = temp;
}
// D[n/3]
if (n % 3 == 0)
{
int temp = go(n / 3) + 1;
if (d[n] > temp)
d[n] = temp;
}
return d[n];
}
int main()
{
int n;
cin >> n;
// cout << go(n) << '\n';
//--------- BOTTOM UP ----------//
d[1] = 0;
for (int i = 2; i <= n; i++)
{
d[i] = d[i - 1] + 1;
if (i % 2 == 0 && d[i] > d[i / 2] + 1)
{
d[i] = d[i / 2] + 1;
}
if (i % 3 == 0 && d[i] > d[i / 3] + 1)
{
d[i] = d[i / 3] + 1;
}
}
cout << d[n] << '\n';
return 0;
}
// ìê° ë³µì¡ë
// í¨ìì í¸ì¶ íì * í¨ìì ìê° ë³µì¡ë
// - 문ì ì ê°ì - -문ì 1ê° í¸ëë° íìí ìê°-
// ì íì: D[N] = min(D[N/3], D[N/2], D[N-1])
// N * O(1)
// ë°ë¼ì ìê° ë³µì¡ë: O(n)