728x90
반응형
1. 재귀호출을 가능하면 사용하지 않는게 좋은 이유
> 이유? 자기 자신이 자기 자신을 호출하기 때문에 처리 속도가 늦다.
> 꼭 사용해야되는이유? 트리구조를 처리할 때(ex. 검색, 수정, 삭제 > 파일탐색기(폴더/하위폴더/하위폴더))
2. 팩토리얼(factorial) == 계승 문제
- 팩토리얼이란? 1부터 어떤 양의 정수 n까지의 정수를 모두 곱한 것을 말하며 n! 이라고 표시
(ex. n! = n*(n-1)*(n-2)*...*1)
* 0! > 0은 양수도, 음수도 아니기 때문에 0! = 1 이라고 약속
코드 1) 5 팩토리얼(5!) 값을 구해서 출력하는 코딩
int n = 5;
int result = 1;
for (int i = 1; i <= 5; i++) {
result *= i;
}
System.out.println(result);
코드 2) 5 팩토리얼 메서드와 재귀 호출 함수 선언 및 호출
public class Ex02 {
public static void main(String[] args) {
int n = 5;
int result = factorial(5); // 팩토리얼 메소드 호출
System.out.println(result);
result = recursiveFactorial(1); // 팩토리얼 재귀 함수 호출 -> 음수가 들어가도 팩토리얼 계산 가능
if(result == -1) {
System.out.println("입력이 잘못되었습니다.");
} else {
System.out.println(result);
}
} // main
// 재귀호출
// ㄱ. 음의 정수의 팩토리얼 = 입력이 잘못되었습니다.
// ㄴ. 0! = 1
// 순서에 따라서 성능차이 발생하니까 순서에 따라서 코딩하기
private static int recursiveFactorial(int n) {
if(n > 1) return n*recursiveFactorial(n-1);
else if(n == 1) return n; // 성능을 빠르게 하기 위해서 연산 처리를 덜 해줌 코드를 넣으면 3*2*1로 연산하는데 안넣으면 3*2*1*1로 *1 연산 1번 더 함
else if(n == 0) return 1;
else return -1;
}
/*
// 재귀호출(처음 만들었던 코드)
private static int recursiveFactorial(int n) {
if(n==1) return n;
else return n * recursiveFactorial(n-1);
}
*/
// 팩토리얼 메서드
private static int factorial(int n) {
int result = 1;
for (int i = 1; i <= n; i++) {
result *= i;
}
return result;
}
} // class
3. 거듭제곱(power) == 누승 == 멱 문제
public class Ex03 {
public static void main(String[] args) {
// [재귀 호출 함수]
// 거듭제곱(power) == 누승 == 멱
// 2 ^3 = 2*2*2 = 8 == 2(밑수)를 3(지수)번 반복해서 곱하세요.
// System.out.println(Math.pow(0, 0)); 제곱근 구하는 함수
// 지수 == 2 제곱 ex) 2^2 2의 제곱
// 지수 == 3 세제곱 ex) 2^3 2의 세제곱
// 지수가 1/2 경우는 제곱근, 1/3 경우는 세제곱근
// double result = power(2, -3); // 2^-3 = 1/2^3 = 0.125
double result = recursivePower(2, 3);
System.out.println(result);
} // main
// 2번 풀이
private static double power(int i, int j) {
double result = 1;
int n = Math.abs(j);
// for (int k = 1; k <= Math.abs(j); k++) { > 성능을 위해서 Math.abs를 변수로 빼고 아래와 같이 코딩하는 것이 좋다.
for (int k = 1; k <= n; k++) {
result *= i;
}
return j < 0 ? 1/result : result;
}
/*
// 1번 풀이
// 양수를 음수로, 음수를 양수로 바꾸기 위해서는 *-1 하면 됨. j * -1 = j
// 음수의 거듭제곱을 구하기 위해서 형을 double로 바꿔야함
private static double power(int i, int j) {
double result = 1;
if (j > 0) {
for (int k = 1; k <= j; k++) {
result *= i;
}
return result;
} else {
j = j*-1;
for (int k = 1; k <= j; k++) {
result *= i;
}
return 1/result;
}
}
/*
// 양수의 거듭제곱만 처리해줄 수 있는 메서드
// 밑수 지수
private static int power(int i, int j) {
int result = 1;
for (int k = 1; k <= j; k++) {
result *= i;
}
return result;
}
*/
} // class
4. 양수 -> 음수, 음수 -> 양수 : 절대값

5. 로또625***
import java.util.Random;
// util : 유용한 클래스를 모아둔 곳
public class Ex04_02 {
public static void main(String[] args) {
// 로또 645
// ㄱ. (int)(Math.random()*45) +1
// ㄴ. rnd.nextInt(45)+1
// Random 클래스(물건) jdk1.5 부터 생김
// Returns a pseudorandom, uniformly distributed int valuebetween 0 (inclusive) and the specified value (exclusive)
// rnd.nextInt(45) : 0 <= ~ < 45 사이에 있는 정수 값을 돌려줌
Random rnd = new Random();
/*
// rnd.nextInt(45) + 1를 사용하여 6개의 값 출력
for (int i = 0; i < 6; i++) {
System.out.println(rnd.nextInt(45) + 1);
}
*/
// 배열 선언 후 초기화 X
// *** 참조형은 초기화 하지 않아도 기본 값으로 초기화 되어져있다.
// int[] 기본값은 0 이다.
int[] lotto = new int[6];
// 로또 번호를 랜덤하게 발생시켜서 lotto 배열에 채워넣는 함수(메서드)
fillLotto(lotto);
int idx = 0;
// 몇 번만에 배열을 다 채울 수 있는지 모르니까(채워질때까지)while 쓰기
while (idx <= 5) {
int temp = rnd.nextInt(45) +1;
if(!isDuplicateLotto(lotto, idx, temp)) {
lotto[idx++] = temp;
//idx++;
}
} //while
// 로또 번호를 호출하는 메서드 > 배열이라는 참조형이 매개변수로 들어가있음 : Call By Reference
dispLotto(lotto);
} // main
// [생성한 로또번호가 중복이 없는지 체크하는 메서드]
public static boolean isDuplicateLotto(int[] lotto, int idx, int temp) {
boolean flag = false;
for (int i = 0; i < idx; i++) {
if(temp == lotto[i]) {
flag = true;
break;
} // if
} // i for
return flag;
}
// [로또 번호 생성하는 메서드]
private static void fillLotto(int[] lotto) {
Random rnd = new Random();
int idx = 0;
// 몇 번만에 배열을 다 채울 수 있는지 모르니까(채워질때까지)while 쓰기
while (idx <= 5) {
int temp = rnd.nextInt(45) +1;
if(!isDuplicateLotto(lotto, idx, temp)) {
lotto[idx++] = temp;
// idx++;를 밖으로 빼지 않고 후위형연사자를 사용하여 코드 라인 줄이기
}
} //while
/*
// for문과 Random을 이용하여 lotto 배열에 로또번호 생성(중복검사X
for (int i = 0; i < lotto.length; i++) {
lotto[i] = rnd.nextInt(45) + 1;
}
*/
} // fillLotto
// [생성된 로또 번호 출력하는 메서드]
private static void dispLotto(int[] lotto) {
// 배열명.length == 배열의 크기(길이) == 6
for (int i = 0; i < lotto.length; i++) {
System.out.printf("[%d]", lotto[i]);
} // i for
System.out.println(); // 개행
} // dispLotto
} // class
5-1. 배열 안에서 중복 체크하기
코드 1)
import java.util.Random;
public class Ex04_03 {
public static void main(String[] args) {
// 배열 안에서 중복 체크
Random rnd = new Random();
boolean flag = false; // 중복X : false, 중복O : true
int[] lotto = new int[6];
lotto[0] = 7;
lotto[1] = 32;
lotto[2] = 15;
lotto[3] = 8;
// 채워넣을 위치(인덱스)
int idx = 4;
int temp;
do {
flag = false;
temp = rnd.nextInt(45) + 1;
for (int i = 0; i < idx; i++) {
if(temp == lotto[i]) {
flag = true;
break;
} // if
} // i for
} while (flag);
lotto[idx] = temp;
System.out.println("END");
} // main
} // class
코드 2) 중복체크하는 메서드 선언 및 호출
package days09;
import java.util.Random;
public class Ex04_04 {
public static void main(String[] args) {
// 배열 안에서 중복 체크
Random rnd = new Random();
boolean flag = false; // 중복X : false, 중복O : true
int[] lotto = new int[6];
int idx = 0;
// 몇 번만에 배열을 다 채울 수 있는지 모르니까(채워질때까지)while 쓰기
while (idx <= 5) {
int temp = rnd.nextInt(45) +1;
if(!isDuplicateLotto(lotto, idx, temp)) {
lotto[idx++] = temp;
//idx++;
}
} //while
System.out.println("END");
} // main
// 배열 안에서 해당위치에 값이 중복체크 해서 true/false 반환하는 메서드
// 중복되면 true 반환
// 중복 X false 반환
public static boolean isDuplicateLotto(int[] lotto, int idx, int temp) {
boolean flag = false;
for (int i = 0; i < idx; i++) {
if(temp == lotto[i]) {
flag = true;
break;
} // if
} // i for
return flag;
} // isDuplicateLotto
} // class
6. 수열(sequence) 문제
- 수열(sequence) : 규칙이 있는 수의 나열(자연수)
- 각 수 : term(항) -> 첫번째항 a1, 두번째 항 a2, n번째항 an (a는 작은 표기법)
- 1 + 2 + 4 + 7 + 11 + 16 + 22 + ... -> increase 증가치
문제1) 20번 째 항의 값은?
코드)
package days09;
public class Ex05 {
public static void main(String[] args) {
// 1 + 2 + 4 + 7 + 11 + 16 + 22 + ... -> increase 증가치
// 1. 20번째 항의 값은?
// 규칙 1,2,3,4.. 순서대로 더하고 있다.
// 1~20번째 항의 값과 총 합 구하기
int increase = 0; // 증가치
int term = 1;
int sum = 0;
// int[] a = new int[20]; // *** 배열로 할시
for (int i = 1; i <= 20; i++) {
term += increase; // 첫번째항은 1이 되고..
// a[i] = term; // *** 배열로 할시
System.out.print(term + "+");
sum += term;
increase++; // 1
}
System.out.println("\b=" + sum);
System.out.println("> 20번째 항 : " + term);
/*
// [또 다른 코딩]
int a[] = new int [20];
a[0] = 1;
System.out.print(a[0]);
for (int i = 1; i <= 19; i++) { // i는 증가치
a[i] = a[i-1] + i;
System.out.print(a[i]);
}
*/
//int term = 1;
int n = 20;
for (int i = 2; i <= n; i++) {
term += (i-1);
}
System.out.println(term);
} // main
} // class
문제2) 항의 값이 250 전까지의 총합구하기
코드)
package days09;
public class Ex05_02 {
public static void main(String[] args) {
int increase = 0; // 증가치
int term = 1;
int sum = 0;
// while(term <= 250) {
while((term += increase) <= 250) { // ***** 이해(암기)
// term += increase;
// if(term > 250) break;
System.out.print(term + "+");
sum += term;
increase++;
}
System.out.println("\b=" + sum);
System.out.println("> 20번째 항 : " + term);
} // main
} // class
728x90
반응형
'TIL > Java' 카테고리의 다른 글
[Java] 배열 관련 코드예제와 Arrays.toString() / System.arraycopy() (0) | 2022.03.01 |
---|---|
[Java] System.in.read() / System.in.skip() / System.in.available() (0) | 2022.02.27 |
[SIST] Java_days08 (0) | 2022.02.24 |
[SIST] Java_days07 (0) | 2022.02.23 |
[SIST] Java_days06 (0) | 2022.02.22 |