def recursive_function(): # def는 함수를 만들 때 사용하는 예약어
print('재귀 함수를 호출합니다.')
recursive_function()
recursive_function()
0! = 1
n>0 이면 n! = n x (n-1)!
5!
5x4x3x2x1= 120
int result = 0
for(int i = 5; i<0;i--){
result = result * i;
}
상태(state)
(n,0) = 1
(0,m) =1
(1,m) =1
(n,m) = n*(n,m-1)
import java.util.Scanner;
public class powerEx {
private static int power(int n, int m){
if (m == 0 ) return 1;
if (n == 0) return 1;
if (n==0) return 1;
return n*power(n, m-1);
}
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
int result = power(n, m);
System.out.printf("%d의 %d 거듭제곱 값 : %d", n, m, result);
}
}
import java.util.Scanner;
public class Gcd {
private static int gCD(int x, int y){
if(y == 0) return x;
else return gCD(y, x%y);
}
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
int result = gCD(n, m);
System.out.printf("%d의 %d 최대공약수 : %d", n, m, result);
}
}
세 개의 기둥과 원판들이 주어졌을 때, 한 기둥에서 다른 기둥으로 모든 원판을 옮기는 문제이며, 원판들은 크기에 따라 다르며, 큰 원판 위에 작은 원판이 올라가야 한다.
핵심 : 목표는 모든 원판을 기둥 A에서 기둥 C로 옮기는 것
- 문제 : https://school.programmers.co.kr/learn/courses/30/lessons/12946
- 규칙
- 한 번에 한 개의 원판만 이동 가능
- 큰 원판 위에 작은 원판 올릴 수 없음
- 어떤 기둥 위에 있는 원판은 그 기둥으로만 이동시킬 수 있음
- 분석
결론
- 원판의 개수가 1개일 경우 : 바로 기둥 A에서 기둥 C로 옮길 수 있다.
- 원판의 개수가 2개 이상인 경우 :
- 가장 작은 원판을 제외한 나머지 원판들을 기둥 A에서 기둥 B로 옮긴다.
- 가장 큰 원판을 기둥 A에서 기둥 C로 옮긴다.
- 기둥 B에 있는 원판들을 기둥 C로 옮긴다.
4 . 코드
import java.util.ArrayList;
import java.util.List;
class Solution {
private List<int[]> hanoi(int n, int from, int to){
if(n == 1) return List.of(new int[] {from, to}); //종료조건 n==1 일때 from to 이동만 시켜라
//점화식 구현
int empty = 6 - from - to;
List<int[]> result = new ArrayList<>();
result.addAll(hanoi(n-1,from,empty));
result.addAll(hanoi(1,from,to));
result.addAll(hanoi(n-1,empty,to));
return result;
}
public int[][] solution(int n) {
return hanoi(n,1,3).toArray(new int[0][]);
}
}
import java.util.Arrays;
class Hanoi {
public int[][] hanoi(int n) {
// 2차원 배열을 완성해 주세요.
int[][] answer = {{1,3}};
System.out.println(n);
return answer;
}
// 아래는 테스트로 출력해 보기 위한 코드입니다.
public static void main(String[] args) {
Hanoi h = new Hanoi();
System.out.println(Arrays.toString(h.hanoi(2)));
}
}
// 하노이의 탑
package recurive;
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.printf("원반[%d]를 %d번 기둥에서 %d번 기둥으로 옮김\n", 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 기둥으로 옮김
}
}
해설 : https://ksb-dev.tistory.com/273
private List<String> generate(String word){
//종료 조건, 점화식 구현
}
// 종료조건 5일 때, 바로 word 반환
private List<String> generate(String word){
//종료 조건 , 점화식 구현
List<String> wrods = new ArrayList<>();
words.add(word);
if(word.length() == 5) return words;
//점화식
}
private List<String> generate(String word){
//종료 조건 , 점화식 구현
List<String> wrods = new ArrayList<>();
words.add(word);
if(word.length() == 5) return words;
//점화식 :사용될 수 있는 모든 문자를 words 붙여야 한다.
private static fianl char[] CHARS = "AEIOU".toCharArray();
}
import java.util.ArrayList;
import java.util.List;
class Solution {
private static final char[] CHARS = "AEIOU".toCharArray();
private List<String> generate(String word){
List<String> words = new ArrayList<>();
words.add(word);
if(word.length() == 5) return words;
for(char c : CHARS){
words.addAll(generate(word + c));
}
return words;
}
public int solution(String word) {
return generate("").indexOf(word);
}
}
import java.util.*;
class Solution {
List<String> list = new ArrayList<>();
void dfs(String str, int len) {
if(len > 5) return;
list.add(str);
for(int i = 0; i < 5; i++) dfs(str + "AEIOU".charAt(i), len + 1);
}
public int solution(String word) {
dfs("", 0);
return list.indexOf(word);
}
}
class Solution {
public int solution(String word) {
int answer = 0, per = 3905;
for(String s : word.split("")) answer += "AEIOU".indexOf(s) * (per /= 5) + 1;
return answer;
}
}