관리 메뉴

거니의 velog

230713 자바 강의 본문

대덕인재개발원_Java

230713 자바 강의

Unlimited00 2023. 7. 13. 19:22

[Selection Sort : n개로 구성된 배열]

(1) 자료의 수가 n개일 때 n-1 회전 수행

(2) 각 회전에서 가장 왼쪽의 자료와 나머지 모든 자료를 비교.

(3) 각 회전 수행 후, 왼쪽의 기준자료를 하나씩 비교대상에서 제외.

 

[50, 37, 69, 7, 42]

1회전 : 7 <= 비교대상에서 제외 / 50, 69, 37, 42

2회전 : 7, 37 <= 비교대상에서 제외 / 69, 50, 42

3회전 : 7, 37, 42 <= 비교대상에서 제외 / 69, 50

4회전 : 7, 37, 42, 50 <= 비교대상에서 제외 / 69


[SortExample.java]

package ddit.chap05.sec02;

import java.util.Arrays;

public class SortExample {

	public static void main(String[] args) {
		
		BubbleSort bubbleSort = new BubbleSort();
		bubbleSort.sort(); // [정렬된 데이터] : [7, 15, 27, 38, 43, 50, 62, 65, 74, 80]
		
		SelectionSort selectionSort = new SelectionSort();
		selectionSort.selectionSort(); 
		selectionSort.printData(); // [정렬된 데이터] : [16, 19, 27, 35, 40, 57, 63, 70, 88, 95]
		
	}

}

class BubbleSort {
	// 멤버변수
	private int[] number;
	
	// 생성자(constructor). 멤버변수 초기화.
	BubbleSort() {
		number = new int[] {27, 15, 38, 62, 7, 43, 80, 65, 50, 74};
	}
	
	public void sort() {
		boolean flag = true; // 개선된 BubbleSort 알고리즘.
		
		System.out.println("[원본 데이터]");
		System.out.println(Arrays.toString(number));
		
		for(int i=0; i<number.length-1; i++) { // n-1 회전수행
			flag = true; // 회전 시작시 true
			for(int j=0; j<number.length-1-i; j++) { // 2개를 비교해서 자리 바꿈(배열의 범위 내에서 비교하기 위해, j<number.length-1). 그리고 하나하나씩 비교대상에서 제외시켜라(-i) / 
				if(number[j]>number[j+1]) {
					int temp = number[j];
					number[j] = number[j+1];
					number[j+1] = temp;
					flag = false; // 자리 바꿈이 한 번이라도 일어나면 false
				}
			}
			if(flag) break; // 자리 바꿈이 한 번도 일어나지 않았다면(flag = true;) 완료되었으므로 반복문을 빠져나와라.
		}
		
		System.out.println("[정렬된 데이터]");
		System.out.println(Arrays.toString(number));
	}
	
}

class SelectionSort {
	// 멤버 변수
	private int[] num;
	
	// 생성자. 멤버 변수-인스턴스 변수(num) 초기화. 
	public SelectionSort() {
		num = new int[] {35, 40, 70, 16, 95, 19, 27, 63, 88, 57}; // 힙 메모리에 10칸을 만들고 값을 넣어 초기화
	}
	
	// 메서드
	public void selectionSort() {
		System.out.println("[원본 데이터]");
		System.out.println(Arrays.toString(num));
		
		for(int i=0; i<num.length-1; i++) { // n-1 회전 수행
			for(int j=i+1; j<num.length; j++) { // 각 회전에서 비교 담당. i번째가 기준키 위치. 비교대상은 이보다 1 더 큰 수(int j=i+1;). 맨 끝까지 비교해야 함(j<s.length).
				if(num[i] > num[j]) {
					int temp = num[i];
					num[i] = num[j];
					num[j] = temp;
				}
			}
		}
		
//		System.out.println("[정렬된 데이터]");
//		System.out.println(Arrays.toString(num));
		
	}
	
	public void printData() {
		System.out.println("[정렬된 데이터]");
		System.out.print("[");
		for(int su : num) {
			System.out.printf("%-2d, ", su);
		}
		System.out.print("]");
	}
}

콘솔 결과


[Dice.java]

package ddit.chap05.sec02;

import java.util.Arrays;

public class Dice {
	
	// 1 ~ 6가지의 경우의 수를 카운트하여 저장하므로 int[6] 칸의 배열 생성.
	
	// 멤버 변수
	private int[] dice = new int[6]; // 멤버 변수는 초기화하지 않아도 오류가 없다. 컴파일러가 자동 초기화(기본 생성자 생성).
	
	public void setDice() {
		for(int i=0; i<50; i++) {
			int rand = (int)(Math.random()*6)+1; // 주사위 눈의 난수 발생(1~6).
			dice[rand-1]++; // 주사위 눈의 -1번째 배열칸에 +1 카운트.
		}
		
//		System.out.println(Arrays.toString(dice));
	}
	
	public void getDiagram() {
		setDice();
		for(int i=0; i<dice.length; i++) {
			System.out.print((i+1) + " | ");
			for(int j=0; j<dice[i]; j++) {
				System.out.print("*");
			}
			System.out.println(dice[i]);
		}
		System.out.println("   -------------------------");
	}
	
}

[DiceExample.java]

package ddit.chap05.sec02;

// 주사위를 50번 던져서 발생된 각 눈의 경우의 수를 저장하고
// 그 자료를 이용하여 1차원 그래프를 작성.
public class DiceExample {

	public static void main(String[] args) {
		
		Dice dice = new Dice();
		dice.setDice(); // 모집단의 크기(50번 roll)가 작으므로 편차가 큰 편. 그래도 값은 잘 나옴.
		dice.getDiagram();
		
	}

}

콘솔 결과


[WordScramble.java]

package ddit.chap05.sec03;

import java.util.Scanner;

public class WordScramble {

	private String[] word = {"apple", "banana", "orange", "persimmon", "hope"};
	
	// 임의의 단어 선택(0~4 사이의 난수)
	public String getWord() {
		int rand = (int)(Math.random()*word.length); // 0 ~ 배열 전체길이-1 만큼의 범위의 난수 발생.
		return word[rand]; // word[0] ~ word[4]
	}
	
	public String shuffle(String str) {
		char[] ch = str.toCharArray(); // String 한 단어(banana)를, char 형태의 배열로 한 글자씩 집어 넣음({b,a,n,a,n,a}).
		for(int i=0; i<1000; i++) {
			int rand = (int)(Math.random()*ch.length); // 0 ~ 배열 전체길이-1 만큼의 범위의 난수 발생.
			char temp = ch[0];
			ch[0] = ch[rand];
			ch[rand] = temp;
		}
		return new String(ch); // ch[0] ~ ch[n-1]. 문자 배열을 문자열로 바꾸는 방법 => new String(ch)
	}
	
	public void answer(String str) {
		int count = 0; // 시도횟수.
		Scanner sc = new Scanner(System.in);
		String anStr = ""; // 사용자가 입력할 정답.
		
		while(true) {
			System.out.print("정답? : ");
			anStr = sc.nextLine();
			count++; // 시도횟수 증가
			if(str.equalsIgnoreCase(anStr)) { // 대문자, 소문자를 무시하고 A = a; 둘다 a로 본다.
				System.out.println("==============");
				System.out.println("정답입니다.");
				System.out.println("시도횟수 : " + count);
				System.out.println("==============");
				break;
			}
		}
		System.out.println("프로그램 종료");
	}
	
}

[WordScrambleExample.java]

package ddit.chap05.sec03;

// 5개의 단어를 배열에 저장한 후 임의의 한 단어를 선택한다.
// 선택된 단어의 철자를 섞어 사용자에게 제시한다.
// 사용자는 제시된 철자들을 보고 원래의 단어를 맞추는 게임.
// 시도횟수도 출력.
public class WordScrambleExample {

	public static void main(String[] args) {
		
		WordScramble ws = new WordScramble();
		
		String str = ws.getWord(); // String 타입으로 반환.
		System.out.println("정답 : " + str);
		
		String question = ws.shuffle(str); // 섞을 단어(str)를 매개변수로 설정.
		System.out.println("제시어 : " + question);
		
		ws.answer(str);
		
	}

}

콘솔 결과


[Point.java]

package ddit.chap05.sec04;

public class Point {
	
	// 2차원 좌표(x, y)
	private int x;
	private int y;
	
	// 기본 생성자
	Point() {
		x = 0;
		y = 0;
	}
	
	// 생성자 오버로딩(overloading). 
	// 전제조건 : 하나의 클래스 안에서 이름이 똑같은 메소드가 복수 개가 존재하는 현상.
	// 필요충분조건 : (1) 메서드의 매개변수의 갯수가 다르거나, (2) 또는 타입이 다르거나, (3) 또는 배열 상태가 다르면 된다.
	// 사용 목적 : 똑같은 메서드로 여러 타입의 다양한 데이터를 취급하고 처리하기 위함이다.
	
	// 지역 변수의 이름과 멤버 변수의 이름이 같은 이유? 
	// 지역(메서드) 안에서 변수를 호출하면 멤버 변수가 대답을 못하고 지역 변수만 참조됨. 데이터 저장 불가. 지역 변수만 참조됨.
	// 지역 변수는 언제 생성되서 소멸? 메서드가 호출되어 생성하고, 호출이 끝나면 소멸(Garbage Collector).
	// Point p1 = new Point(); -> 매개 변수가 없으므로 기본 생성자 Point()가 호출됨.
	// Point p2 = new Point(10, 20); -> 매개 변수 2개에 데이터 타입이 int 이므로 Point(int x, int y)가 호출됨.
	// p2이 new Point(10, 20)을 호출하면 10, 20이라는 값을 매개변수로 전달하고 메서드 실행을 한 뒤 소멸.
	// 이 짧은 순간에 int x = 10; 은 Point 클래스 안에 멤버변수 private int x;에 얼른 전달하여 힙 메모리에 저장.
	//           int y = 20; 은 Point 클래스 안에 멤버변수 private int y;에 얼른 전달하여 힙 메모리에 저장.
	// 이 때 사용하는 특별한 참조 변수가 this. 자기 자신의 클래스 주소 값을 this가 가지고 있다. 자바에서 만든 특수 변수(super-부모 클래스의 주소, this-자기 자신 클래스의 주소).
	
	Point(int x, int y) {
		this.x = x;
		this.y = y;
	}
	
	// 오버라이드(@Override) : 메서드 재정의
	// 반드시 상속관계에 있는 두 개 이상의 클래스에서 발생하는 개념.
	// 메서드의 머리(Header), 선언부-public String toString()가 부모와 자식이 똑같아야 한다.
	// 내용은 달라도 된다.
	// 다형성-상속 개념을 알아야 함.
	// 하나의 부모 이름을 중심으로 여러 형태의 자식 메서드가 서로 다른 구현을 만족시키기 위함.
	@Override
	public String toString() {
		return "(" + x + ", " + y + ")";
	}

}

[Triangle.java]

package ddit.chap05.sec04;

public class Triangle {

	// 3개의 꼭지점
	private Point p1;
	private Point p2;
	private Point p3;
	
	// 생성자
	Triangle(Point p1, Point p2, Point p3) {
		this.p1 = p1;
		this.p2 = p2;
		this.p3 = p3;
	}
	
	public void draw() {
		System.out.println(p1 + "과 " + p2 + "을(를) 연결합니다.");
		System.out.println(p2 + "과 " + p3 + "을(를) 연결합니다.");
		System.out.println(p3 + "과 " + p1 + "을(를) 연결합니다.");
	} 
	
}

[ShapeExample.java]

package ddit.chap05.sec04;

public class ShapeExample {

	public static void main(String[] args) {
		
		Triangle t1 = new Triangle(new Point(100, 100),
								   new Point(500, 100),
								   new Point(250, 250)); // 객체 생성.
		
//		t1.draw(); // 이대로 하면 주소값만 출력.
		/*
		 * ddit.chap05.sec04.Point@15db9742과 ddit.chap05.sec04.Point@6d06d69c을(를) 연결합니다.
		 * ddit.chap05.sec04.Point@6d06d69c과 ddit.chap05.sec04.Point@7852e922을(를) 연결합니다.
		 * ddit.chap05.sec04.Point@7852e922과 ddit.chap05.sec04.Point@15db9742을(를) 연결합니다.
		 */
		
		t1.draw(); // Point 클래스에서 toString() 메서드를 오버라이딩(재정의)하여 내용을 출력.
		
//		https://zangzangs.tistory.com/44
		
//		Has-a 관계 - 문장이 성립되어지면 상속 관계. 삼각형은 점을 포함하고 있다(O).
//		is-a관계 - 문장이 성립되면 포함 관계. 삼각형은 점입니다(X).
		
	}

}

콘솔 결과

 

'대덕인재개발원_Java' 카테고리의 다른 글

230717 자바 강의  (0) 2023.07.17
230714 자바 강의  (0) 2023.07.14
230712 자바 강의  (0) 2023.07.12
230711 자바 강의  (0) 2023.07.12
230710 자바 강의  (0) 2023.07.12