Climbing Stairs
ํ๊ตญ์ด
๋น์ ์ ๊ณ๋จ์ ์ค๋ฅด๊ณ ์์ต๋๋ค. ์ ์์ ๋๋ฌํ๋ ค๋ฉด nnn ๊ณ๋จ์ ์ฌ๋ผ์ผ ํฉ๋๋ค.
ํ ๋ฒ์ 1๊ณ๋จ ๋๋ 2๊ณ๋จ์ฉ ์ค๋ฅผ ์ ์์ ๋, ์ ์๊น์ง ๋๋ฌํ๋ ์๋ก ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์๋ ๋ช ๊ฐ์ง์ธ๊ฐ์?
1. ๋ฌธ์ ๋ถ์
๊ณ๋จ์
n๊ฐ์ ๊ณ๋จ์ ์ฌ๋ผ์ผํจ.ํ ๋ฒ์ 1๊ณ๋จ ๋๋ 2๊ณ๋จ ์ค๋ฅผ ์ ์์.
์ ์๊น์ง ๋๋ฌํ๋ ์๋ก ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ ๋ฅผ ๊ตฌํด์ผ ํจ.
2. ์์ ๊ฒฝ์ฐ๋ถํฐ ์๊ฐํด ๋ณด๊ธฐ(ํจํด ์ฐพ๊ธฐ)
๊ณ๋จ์ ์ค๋ฅด๋ ๋ฐฉ๋ฒ์ ์์ ์ซ์๋ก ์ง์ ์ธ์ด๋ณด๋ฉด ๊ท์น์ด ๋ณด์.
์์ 1: n = 1
๋ฐฉ๋ฒ: (1)
โ 1๊ฐ์ง ๋ฐฉ๋ฒ
์์ 2: n = 2
๋ฐฉ๋ฒ: (1 + 1), (2)
โ 2๊ฐ์ง ๋ฐฉ๋ฒ
์์ 3: n = 3
๋ฐฉ๋ฒ: (1+1+1), (1+2), (2+1) โ 3๊ฐ์ง ๋ฐฉ๋ฒ
์์ 4: n = 4
n = 4๋ฐฉ๋ฒ:
(1+1+1+1)(1+1+2)(1+2+1)(2+1+1)(2+2)โ 5๊ฐ์ง ๋ฐฉ๋ฒ
3. ์ ํ์(์ฌ๊ท์) ์ฐพ๊ธฐ
๊ฐ ์ซ์์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ์ผ์ ํ ํจํด์ด ๋ณด์.
n
๋ฐฉ๋ฒ์ ์
1
1
2
2
3
3
4
5
5
8
6
13
ํจํด ๋ฐ๊ฒฝ :
f(3) = f(2) + f(1) = 2 + 1 = 3f(4) = f(3) + f(2) = 3 + 2 = 5f(5) = f(4) + f(3) = 5 + 3 = 8
โ ์ฆ, ๊ณ๋จ n ๊ฐ๋ฅผ ์ค๋ฅด๋ ๋ฐฉ๋ฒ์ ์๋ ๋ค์๊ณผ ๊ฐ์ ์ ํ์์ ๋ฐ๋ฆ
f(n-1): ๋ง์ง๋ง์1 ๊ณ๋จ์ ์ฌ๋์ ๋์ ๊ฒฝ์ฐ์ ์f(n-2): ๋ง์ง๋ง์2 ๊ณ๋จ์ ์ฌ๋์ ๋์ ๊ฒฝ์ฐ์ ์
์ด ์ ํ์์ ํผ๋ณด๋์น ์์ด ๊ณผ ๋์ผํ ๊ตฌ์กฐ์
(๋จ, ์ด๊ธฐ๊ฐ f(1) = 1, f(2) = 2 )
4. ์ ์ฌ๊ท๋ก ํ ์ ์๋๊ฐ?
์ด๋ฏ๋ก,
n์ ๊ตฌํ๋ ค๋ฉด ๋จผ์ n-1๊ณผn-2๋ฅผ ๊ณ์ฐํด์ผํจ.์ ๊ตฌํ๋ ค๋ฉด ๋ค์ ์ ์ด ํ์ํ๊ณ , ๊ณ์ ์ชผ๊ฐ์ง๊ฒ ๋จ.
๋ฐ๋ผ์, ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ (
n-1,n-2๋ฑ)๋ก ์ชผ๊ฐ์ ํด๊ฒฐํ๋ "๋ถํ ์ ๋ณต(Divide & Conquer)" ํํ๊ฐ ๋จ.
์ฌ๊ท ํธ์ถ ๊ตฌ์กฐ ์์(n = 5 ์ผ ๋)
climbStairs(5)
โโโ climbStairs(4)
โ โโโ climbStairs(3)
โ โ โโโ climbStairs(2) โ 2
โ โ โโโ climbStairs(1) โ 1
โ โ โโโ ๊ฒฐ๊ณผ: 3
โ โโโ climbStairs(2) โ 2
โ โโโ ๊ฒฐ๊ณผ: 5
โโโ climbStairs(3)
โ โโโ climbStairs(2) โ 2
โ โโโ climbStairs(1) โ 1
โ โโโ ๊ฒฐ๊ณผ: 3
โโโ ๊ฒฐ๊ณผ: 85. ์ฌ๊ท ์ฝ๋
public class SlimbingStairs{
public static int climbStairs(int n) {
if (n == 1) return 1;
if (n == 2) return 2;
return climbStairs(n-1) + climbStairs(n - 2);
}
public static void main(String[] args) {
System.out.println(climbStairs(5)); // result : 8
}
}6. ๋ ๋น ๋ฅธ ๋ฐฉ๋ฒ(DP)
๋ฐ๋ณต๋ฌธ์ผ๋ก O(n), O(1) ์ต์ ํ
public class ClimbingStairs {
public static int climbStairs(int n) {
if (n == 1) return 1;
if (n == 2) return 2;
int first = 1;
int sencond = 2;
for (int i = 3; i <= n; i++) {
int third = first + second;
first = second;
second = third;
}
return second;
}
public static void main(String[] args) {
System.out.println(climbStairs(5)); // result : 8
}
}Last updated
Was this helpful?