8/26 [자바]- 피보나치 수열, 버블정렬, 선택정렬, 이진탐색, 인터페이스
[재귀함수]
피보나치수열
fibo(1):첫번째 항구하기 -> 첫번째 항은 1로 정해져있다
fibo(2) -> 1 =0+1 -> 0이라는 값이 있다고 가정하기 fibo(0)+fib(1)
fibo(3) -> 2=fibo(1)+fibo(0)+fibo(1)
↓
fibo(2)
fibo(n) = fibo(n-2)+fibo(n-1)
public class 피보나치 {
public static void main(String[] args) {
fiboPrint(7); //fibo()활용해서 특정항 까지 출력
for(int i=1 ; i<=8; i++) {
System.out.print(fibo(i)+" ");
}
}
//
public static void fiboPrint(int n) {
for(int i=1 ; i<=n; i++) {
if(i<=1) {
System.out.println(i);
}else {
System.out.println(fibo(i-2)+fibo(i-1));
}
}
}
//피보나치 수열에 특정 항의 값을 구하는 메서드
public static int fibo(int n) {
if(n<=1) {
return n;
}else {
return fibo(n-2)+fibo(n-1);
}
}
}
정렬 알고리즘: 원소들을 일정한 순서대로 열거하는 알고리즘
선택정렬: 특정인덱스에 들어가는걸 차근차근 찾아감
삽입 정렬: 찾아서 중간에 삽입
버블 정렬:
병합 정렬:안에서 정렬후 통합
힙 정렬: 이진트리 형식 사용하여 정렬
퀵 정렬: 중심적으로 왼쪽을 위로 or 중심적 오른쪽을 위로
기수 정렬: 1의 자리숫자 먼저 확인하고 10의자리 숫자 확인
버블 정렬: 두 인접한 요소를 비교하여 정렬하는 방법 속도는 느리지만 코드가 단순함
<버블정렬 오름차순>
package 버블정렬;
import java.util.Arrays;
public class 버블정렬_오름차순 {
public static void main(String[] args) {
int[]arr= {10, 24, 7, 68, 42, 82, 3, 43};
System.out.println("정렬 전 : " +Arrays.toString(arr));
//버블정렬_오름차순
//바깥쪽 반복문: 배열의 크기-1(크기 : 8 -> 반복문 :7)
for(int i=0; i<arr.length-1; i++) {
//안쪽반복문 : 0번 인덱스부터 인접요소 비교
//j : 기준(크기: 8인 배열, j:0~6(1회차) j:0~5(2회차))
int cnt =0; //n회차 안쪽 반복문 실행 시 값이 바뀌는 횟수 카운팅
boolean sw =false; // n회차 안쪽 반복문 실행 시 값이 한번이라도 바뀌면 -> true
for(int j =0;j<arr.length-1-i;j++) {
//0-1 -> 1-2 -> 2-3 -> 3-4
if(arr[j]> arr[j+1]) {
//j -> j+1 /j+1 -> j(치환)
int temp = arr[j+1]; //둘 중 하나의 값으 임시적으로 저장
arr[j+1] = arr[j];
arr[j] = temp;
cnt++;
sw =true;
}
}
if(!sw){ //sw 가 false 일때 반복문 나가게 !sw와 sw==false는 같은말이다
//false -> true true -> false
break;
}
//더이상 바뀌는게 없으면 정렬을 수행(그다음 안쪽 반복문 실행)하지 않도록
System.out.println(i+1+"번째 회 차 : "+ Arrays.toString(arr));
}
}
}
package 버블정렬;
import java.util.Arrays;
public class 버블정렬_내림차순 {
public static void main(String[] args) {
int[] arr = { 10, 24, 7, 68, 42, 82, 3, 43 };
System.out.println("정렬 전 : " + Arrays.toString(arr));
// 버블정렬_내림차순
// 바깥쪽 반복문: 배열의 크기-1(크기 : 8 -> 반복문 :7)
for (int i = 0; i < arr.length - 1; i++) {
// 안쪽반복문 : 0번 인덱스부터 인접요소 비교
// j : 기준(크기: 8인 배열, j:0~6(1회차) j:0~5(2회차))
int cnt = 0; // n회차 안쪽 반복문 실행 시 값이 바뀌는 횟수 카운팅
boolean sw = false; // n회차 안쪽 반복문 실행 시 값이 한번이라도 바뀌면 -> true
for (int j = 0; j < arr.length - 1 - i; j++) {
// 0-1 -> 1-2 -> 2-3 -> 3-4
if (arr[j] < arr[j + 1]) {
// j -> j+1 /j+1 -> j(치환)
int temp = arr[j + 1]; // 둘 중 하나의 값을 임시적으로 저장
arr[j + 1] = arr[j];
arr[j] = temp;
cnt++;
sw = true;
}
}
if (!sw) { // sw 가 false 일때 반복문 나가게 !sw와 sw==false는 같은말이다
// false -> true true -> false
break;
}
// 더이상 바뀌는게 없으면 정렬을 수행(그다음 안쪽 반복문 실행)하지 않도록
System.out.println(i + 1 + "번째 회 차 : " + Arrays.toString(arr));
}
}
}
선택 정렬
가장 큰 원소 또는 작은 원소를 찾아 주어진 위치(리스트 처음~끝)를 교체해 나가는 방법
<선택정렬_오름차순>
package 선택정렬;
import java.util.Arrays;
public class 선택정렬_오름차순 {
public static void main(String[] args) {
int[] arr= {98, 7, 70, 13, 24};
System.out.println("정렬 전 : "+Arrays.toString(arr));
//3번 인덱스에 들어갈 숫자만 찾으면 4번 인덱스는 이미 확정이 되어있음
for(int i=0; i<arr.length-1; i++) {
//현재 가장 작은 숫자에 위치 기억
//1회차 - 0 , 2회차 - 1, 3회사 - 2
int index = i;
for(int j=i+1;j<arr.length;j++) { //index번호 - index 번호 바로 뒷자리 부터 비교 시작 ~ 배열의 끝
//인덱스 번호가 바뀔 조건
if(arr[index]> arr[j]) { //지금까지 본 배열의 값중 가장 작은 값의 위치를 저장 //방향바꾸면 내림차순
//현재 index가 가리키고 있는 자리 저장된 값 > 비교되고 있는 자리의 숫자)
index=j;
//index가 비교되고 있는 자리를 가리키게
}
}//배열내에서 n번째 가장 작은 값의 위치 저장
//찾은 값이 원하는 위치에 저장될 수 있게하는 코드
//제일 작은 값 -> 0 두번째로 작은값 ->1
if(i!=index) {//원래 숫자의 자리와 제일 작은숫자 저장된 자리가 다를때만
int temp = arr[index];
arr[index]=arr[i];
arr[i]=temp;
}
System.out.println(i+1+"회차 : "+Arrays.toString(arr));
}
}
}
<선택정렬- 내림차순>
package 선택정렬;
import java.util.Arrays;
public class 선택정렬_오름차순 {
public static void main(String[] args) {
int[] arr= {98, 7, 70, 13, 24};
System.out.println("정렬 전 : "+Arrays.toString(arr));
//3번 인덱스에 들어갈 숫자만 찾으면 4번 인덱스는 이미 확정이 되어있음
for(int i=0; i<arr.length-1; i++) {
//현재 가장 작은 숫자에 위치 기억
//1회차 - 0 , 2회차 - 1, 3회사 - 2
int index = i;
for(int j=i+1;j<arr.length;j++) { //index번호 - index 번호 바로 뒷자리 부터 비교 시작 ~ 배열의 끝
//인덱스 번호가 바뀔 조건
if(arr[index] < arr[j]) { //지금까지 본 배열의 값중 가장 작은 값의 위치를 저장
//현재 index가 가리키고 있는 자리 저장된 값 > 비교되고 있는 자리의 숫자)
index=j;
//index가 비교되고 있는 자리를 가리키게
}
}//배열내에서 n번째 가장 작은 값의 위치 저장
//찾은 값이 원하는 위치에 저장될 수 있게하는 코드
//제일 작은 값 -> 0 두번째로 작은값 ->1
if(i!=index) {//원래 숫자의 자리와 제일 작은숫자 저장된 자리가 다를때만
int temp = arr[index];
arr[index]=arr[i];
arr[i]=temp;
}
System.out.println(i+1+"회차 : "+Arrays.toString(arr));
}
}
}
검색 알고리즘 :특정 원소를 검색하는 알고리즘
순차 검색: 가장 단순한 검색방법으로 원소의 정렬이 필요 없다 하지만 리스트 길이가 길면 비효율적
이진 검색: 리스트의 중간 값을 정해 크고 작음을 비교해 검색하는 알고리즘 정렬된 리스트에 사용할 수 있다
더 작은 수로/ 내가 봐야 하는 배열의 중간값 찾기
<이진 탐색>
package 이진탐색;
public class 이진탐색 {
public static void main(String[] args) {
//이진탐색 : 정렬이 되어있는 배열에서만 사용(사전)
int[]arr = {1,7,19,25,30,33,41,66,78,90};
int num = 78; // 내가 찾고 싶은 숫자
int lowIndex=0; //찾아야하는 배열의 구역중 가장 낮은 인덱스 번호 포인터
int highIndex=arr.length-1; //가장 높은 인덱스 번호 포인터
while(true) {
//현재 봐야하는 배열 구역중에서 센터 찾아야함!
int centerIndex = (lowIndex+highIndex)/2;
if(arr[centerIndex]==num) {
System.out.println(centerIndex);
break;
}else {
if(arr[centerIndex]>num) {
highIndex = centerIndex-1;
}else { //arr[centerIndex]<num
lowIndex = centerIndex+1;
}
}
}
}
}
interface(인터페이스)-구현예시
jdbc
<Animal.java>
package Ex01;
public class Animal {
public void eat() {
System.out.println("냠냠 먹기!");
}
public void move() {
System.out.println("휘적휘적 움직이기!");
}
}
<AnimalMain>
package Ex01;
public class AnimalMain {
public static void main(String[] args) {
//Dog 객체가 잘 생성되고 사용이 되는지 확인해보기
Dog d = new Dog();
System.out.print("Dog 객체 : ");
d.eat();
Cat c = new Cat();
System.out.print("Cat 객체 : ");
c.eat();
// 형변환(Casting)
// - 기본 데이터 타입에 대한 형변환 -> 데이터의 크기를 변환하는 기능
// - 객체 타입에 대한 형변환 -> 객체의 타입을 변환하는 기능
// - 객체 타입에 대하여 형변환을 진행 할 때, 꼭! 상속의 개념이 있어야 한다
//묵시적(자동) 형변환 -> 업캐스팅 개념
// : 자식 클래스가 부모 클래스의 타입으로 형태가 변형 되는 것
// ex) 강아지(자식)는 동물(부모)이다 -> O
// 고양이는 동물이다 -> O
System.out.println();
System.out.println("-----업캐스팅-----");
Animal a1 = new Dog();
a1.eat();
Animal a2 = new Cat();
a2.eat();
//명시적(강제) 형변환 -> 다운캐스팅
//동물은 강아지다 -> X
//Dog d1 = (Dog) new Animal();
//문법적으로는 문제가 없으나 실행시 오류가 발생한다 -> 런타임 오류
//업캐스팅 되어 있는 객체가 원래의 객체타입으로 돌아가는 것!
System.out.println();
System.out.println("-----다운캐스팅-----");
Dog d1 =(Dog) a1;
d1.eat();
Cat c1 = (Cat) a2;
c1.eat();
}
}
<cat>
package Ex01;
public class Cat extends Animal{
public void eat() {
System.out.println("츄르 냠냠");
}
}
<dog>
package Ex01;
public class Dog extends Animal{
public void eat() {
System.out.println("뼈다귀 냠냠");
}
}
<<햄버거 만들기>
Burger
package Ex02;
public class Burger {
public void make() {
System.out.println("기본 햄버거 만들기");
}
}
CheeseBurger
package Ex02;
public class CheeseBurger extends Burger {
public void cheesemake() {
System.out.println("치즈버거 만들기!");
}
//자식이 부모의 기능을 불러오기 위한 메소드
public void make() {
super.make();
}
}
BurgerMain
package Ex02;
public class BurgerMain {
public static void main(String[] args) {
Burger burger = new Burger();
CheeseBurger cheese = new CheeseBurger();
burger.make();
cheese.cheesemake();
System.out.println();
Burger b1 = new CheeseBurger();
b1.make();
System.out.println();
// CheeseBurger c1 = (cheeseBurger) b1;
cheese.make();
cheese.cheesemake();
}
}
<인형뽑기>
<Machine>
package Ex03;
public class Machine {
//인형을 뽑을 수 있는 기계
//기계 안에 피카츄/ 파이리/ 꼬부기 -> 인형 이라는 공통점!
// public void pick(Pika p) { //피카츄 인형
// p.pika();
// }
// public void pick(Pairi p) { //파이리 인형
// p.pairi();
// }
// public void pick(Kkobuk k) { //꼬부기 인형
// k.Kkobuk();
// }
public void pick(Doll d) {
d.doll();
}
}
<Pika>
package Ex03;
public class Pika extends Doll {
public void doll() {
System.out.println("피카츄 인형!");
}
}
<Pairi>
package Ex03;
public class Pairi extends Doll {
public void doll() {
System.out.println("파이리 인형!");
}
}
<kkobuk>
package Ex03;
public class Kkobuk extends Doll {
public void doll() {
System.out.println("꼬부기 인형!");
}
}
<machinemain>
package Ex03;
import java.util.Random;
public class MachineMain {
public static void main(String[] args) {
//인형뽑기 기계가 실제로 실행될 수 있는 곳!
Machine m = new Machine();
Pika pika = new Pika();
// m.pick(pika);
Pairi pairi = new Pairi();
// m.pick(pairi);
Kkobuk kkobuk = new Kkobuk();
// m.pick(kkobuk);
System.out.println();
System.out.println("랜덤 인형뽑기");
//랜덤으로 인형을 뽑아보자!
Doll[]dolls = {pika, pairi, kkobuk};
Random rd = new Random();
int choice = rd.nextInt(dolls.length);
m.pick(dolls[choice]);
}
}
<doll>
package Ex03;
public class Doll {
//만들어 지는 여러 인형들을 관리할 수 있는 부모 클래스!
public void doll() {
System.out.println("인형 입니다~");
}
}