written by sohyeon, hyemin ๐ก
์ฌ๊ท
๋ ์์ ์ ์ ์ํ ๋ ์๊ธฐ ์์ ์ ์ฌ์ฐธ์กฐํ๋ ๋ฐฉ๋ฒ์ ๋งํ๋ค.
์ด๋ค ์ฌ๊ฑด์ด ์๊ธฐ ์์ ์ ํฌํจํ๊ณ ๋ค์ ์๊ธฐ ์์ ์ ์ฌ์ฉํ์ฌ ์ ์๋ ๋ ์ฌ๊ท์ (recursive)
์ด๋ผ๊ณ ํ๋ค.
์ฌ๊ท ์๊ณ ๋ฆฌ์ฆ์ ์๋ง์ ๊ฒฝ์ฐ๋ 'ํ์ด์ผ ํ ๋ฌธ์ ', '๊ณ์ฐํ ๋ฉ์๋', '์ฒ๋ฆฌํ ๋ฐ์ดํฐ ๊ตฌ์กฐ'๊ฐ ์ฌ๊ท๋ก ์ ์๋๋ ๊ฒฝ์ฐ์ด๋ค.
์ฌ๊ท๋ฅผ ์ฌ์ฉํด ์์ฑํ ์ ์๋ ๊ฐ์ฅ ์ต์ํ ์์๋ ํฉํ ๋ฆฌ์ผ
์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ด๋ค.
1. 0!=1
2. n>0์ด๋ฉด, n! = n x (n-1)!
class Factorial{
static int factorial(int n){
if(n>0)
return n*factorial(n-1);
else
return 1;
}
}
๋ ์ ์์ ์ต๋๊ณต์ฝ์๋ฅผ ์ฌ๊ท์ ์ผ๋ก ๊ตฌํ๋ ๋ฐฉ๋ฒ์ด๋ค.
- ๋ ์ ์๋ฅผ ๋ ๋ณ์ ๊ธธ์ด๋ก ํ๋ ์ง์ฌ๊ฐํ์ ๋ง๋ ๋ค.
- ์ง์ฌ๊ฐํ์ ์ ์ฌ๊ฐํ์ผ๋ก ์์ ํ ์ฑ์ด๋ค.
- ์ ์ฌ๊ฐํ๋ง์ผ๋ก ์ฑ์์ง์ง ์์ ๋, ๋จ์ ์ง์ฌ๊ฐํ์ ๊ฐ์ ์์ ์ ๋ฐ๋ณตํ๋ค.
- ์ ์ฌ๊ฐํ๋ง์ผ๋ก ๊ตฌ์ฑ๋์์ ๋์ ๋ณ์ ๊ธธ์ด๊ฐ ์ต๋ ๊ณต์ฝ์์ด๋ค.
ํฐ ๊ฐ์ ์์ ๊ฐ์ผ๋ก ๋๋ ๋ ๋๋์ด ๋จ์ด์ง๋ ๊ฐ์ฅ ์์ ๊ฐ์ด ์ต๋๊ณต์ฝ์
์ด๋ค.
๋๋์ด์ง์ง ์์ผ๋ฉด ์์๊ฐ์ ๋ํด ๋๋์ด ๋จ์ด์ง๋๊น์ง ๊ฐ์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
๋ ์ ์ x, y์ ์ต๋๊ณต์ฝ์ -> gcd(x, y)
x = az
y = bz
z = gcd(x,y)
y๊ฐ 0์ด๋ฉด x์ด๊ณ y๊ฐ 0์ด ์๋๋ฉด gcd(y, x%y)
class EuclidGCD{
static int gcd(int x, int y){
if(y==0)
return 0;
else
return gcd(y, x%y);
}
}
์์ ์๋ฐ์ด ์, ํฐ ์๋ฐ์ด ์๋์ ์์นํ ์ ์๋๋ก ์๋ฐ์ 3๊ฐ์ ๊ธฐ๋ฅ ์ฌ์ด์์ ์ฎ๊ธฐ๋ ๋ฌธ์ ์ด๋ค.
๋ชจ๋ ์๋ฐ์ ํฌ๊ธฐ๊ฐ ๋ค๋ฅด๊ณ ๋ชจ๋ ์๋ฐ์ด ์ด ๊ท์น์ ๋ง๊ฒ ์ฒซ ๋ฒ์งธ ๊ธฐ๋ฅ์ ์์ฌ์๋ค.
๋ชจ๋ ์๋ฐ์ ์ธ ๋ฒ์งธ ๊ธฐ๋ฅ์ผ๋ก ์ต์์ ํ์๋ก ์ฎ๊ธด๋ค.
์๋ฐ์ 1๊ฐ์ฉ ์ฎ๊ธธ ์ ์๋ค.
์๋ฐ์ด n๊ฐ ์กด์ฌํ๊ณ ๊ธฐ๋ฅ 3๊ฐ๋ฅผ ๊ฐ๊ฐ ์์ ๊ธฐ๋ฅ, ์ค๊ฐ ๊ธฐ๋ฅ, ๋ชฉํ ๊ธฐ๋ฅ์ด๋ผ๊ณ ํ ๋
๊ฐ์ฅ ํฐ ์๋ฐ์ ๋ชฉํ ๊ธฐ๋ฅ์ผ๋ก ์ต์์ ์ด๋ํ์๋ก ์์ง์ด๊ธฐ ์ํด์๋
๋จผ์ ๊ฐ์ฅ ํฐ ์๋ฐ์ ์ ์ธํ n-1๊ฐ์ ์๋ฐ ๊ทธ๋ฃน
์ ์ค๊ฐ ๊ธฐ๋ฅ์ผ๋ก ์ด๋์์ผ์ผ ํ๋ค.
์ด ๊ณผ์ ์ ํฌ๊ฒ 3๋จ๊ณ๋ก ๋ณผ ์ ์๋ค.
- ๊ทธ๋ฃน์ ์ค๊ฐ ๊ธฐ๋ฅ์ผ๋ก ์ด๋
- ๊ฐ์ฅ ํฐ ์๋ฐ์ ๋ชฉํ ๊ธฐ๋ฅ์ผ๋ก ์ด๋
- ๊ทธ๋ฃน์ ๋ชฉํ ๊ธฐ๋ฅ์ผ๋ก ์ด๋
-
move(no) : ์ด๋ ๋ฉ์๋, ๋งค๊ฐ๋ณ์ no๋ ์ฎ๊ฒจ์ผ ํ ์๋ฐ์ ๊ฐ์
-
x : ์์ ๊ธฐ๋ฅ์ ๋ฒํธ
-
y : ๋ชฉํ ๊ธฐ๋ฅ์ ๋ฒํธ
๊ธฐ๋ฅ ๋ฒํธ๋ฅผ 1, 2, 3์ผ๋ก ๋ํ๋, ๊ธฐ๋ฅ ๋ฒํธ์ ์ ํฉ์ด 6์ด๋ฏ๋ก
์์ ๊ธฐ๋ฅ๊ณผ ๋ชฉํ ๊ธฐ๋ฅ์ด ๋ฌด์์ด๋ ์ค๊ฐ๊ธฐ๋ฅ์ 6-x-y๋ก ๊ตฌํ ์ ์๋ค.
import java.util.Scanner;
class Hanoi {
// no๊ฐ์ ์๋ฐ์ x๋ฒ ๊ธฐ๋ฅ์์ y๋ฒ ๊ธฐ๋ฅ์ผ๋ก ์ฎ๊น
static void move(int no, int x, int y) {
if (no > 1)
move(no - 1, x, 6 - x - y);
System.out.println("์๋ฐ[" + no + "]์ " + x + "๊ธฐ๋ฅ์์ " + y + "๊ธฐ๋ฅ์ผ๋ก ์ฎ๊น");
if (no > 1)
move(no - 1, 6 - x - y, y);
}
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
System.out.println("ํ๋
ธ์ด์ ํ");
System.out.print("์๋ฐ ๊ฐ์๏ผ");
int n = stdIn.nextInt();
move(n, 1, 3); // 1๋ฒ ๊ธฐ๋ฅ์ n๊ฐ๋ฅผ 3๋ฒ ๊ธฐ๋ฅ์ผ๋ก ์ฎ๊น
}
}