TIL/Java

[SIST] Java_days09

야리니 2022. 2. 25. 22:24
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
반응형