배열에서의 정렬작업.(Selection Sort)
자바에서는 배열의 단점을 보완하기위해 collection 사용함
collection 도 배열과 사용하는 방법 동일
변수 하나가 별도로 있어야 저장해뒀다가 덮어씌움
num[0] > num[1,2,3,4]? num[0]이 더 크면 자리바꿈 : 정렬의 기본 원리
int num[] = {35,27,13,5,10}
27 35 13 5 10
13 35 27 5 10
5 35 27 13 10
5 35 27 13 10 (4번 반복)
->5는 전체데이터중 가장 작은 값으로 고정.
5 27 35 13 10
5 13 35 27 10
5 10 35 27 13 (3번 반복)
->5 ,10 고정.
5 10 27 35 13
5 10 13 35 27 (2번 반복)
->5 ,10, 13 고정.
5 10 13 27 35 (1번 반복)
->정렬 끝
이중 for문 이용. 전체적으로 '배열의 length-1'번, 내부적으로 4-3-2-1번
import java.util.Scanner;
public class Test1 {
public static void main(String[] args) {
//세 개의 수를 입력받아서 작은 수 에서 큰 수로 출력
Scanner sc = new Scanner(System.in);
int num1,num2,num3,temp;
System.out.print("세개의 수?");//9 5 2
num1 = sc.nextInt();
num2 = sc.nextInt();
num3 = sc.nextInt();
/*
//1-2, 2-3, 1-2비교
if(num1>num2){
temp = num1;
num1 = num2;
num2 = temp;
}
if(num2>num3){
temp = num2;
num2 = num3;
num3 = temp;
}
if(num1>num2){
temp = num1;
num1 = num2;
num2 = temp;
}
*/
//1-2, 1-3, 2-3비교
if(num1>num2){
temp = num1;
num1 = num2;
num2 = temp;
}
if(num1>num3){
temp = num1;
num1 = num3;
num3 = temp;
}
if(num2>num3){
temp = num2;
num2 = num3;
num3 = temp;
}
System.out.printf("결과 : %d %d %d\n",num1, num2, num3);
sc.close();
}
}
실행 화면
선택정렬 Selection Sort
import java.util.Scanner;
public class Test2 {
public static void main(String[] args) {
//int[] num = { 28, 65, 7, 4, 10 };
int i, j, temp;
int num[] = new int[5];
Scanner sc = new Scanner(System.in);
//입력
System.out.print("다섯개의 숫자를 입력하세요:");
for(i=0;i<num.length;i++){
num[i]= sc.nextInt();
}
//출력
System.out.print("Source data: ");
for (i = 0; i < num.length; i++) {
System.out.printf("%4d", num[i]); // 공백 네칸의 자리를 두고 숫자 출력
}
System.out.println();
//선택정렬 Selection Sort
for (i = 0; i < num.length - 1; i++) {
for (j = i + 1; j < num.length; j++) { // 기준값과 비교하는 수는 항상 +1번째부터
// 시작부터 ~ 마지막 배열의자리까지
//System.out.println(i+":"+j); //인덱스마다 회전수 조회
if (num[i] > num[j]) { //부등호에 따라 내림차순(<), 오름차순(>) 정렬 가능. 크기에 따라 자리바꿈 진행
temp = num[i];
num[i] = num[j];
num[j] = temp;
}
}
}
// 출력
System.out.print("Sorted data: ");
for (int su : num) {// 확장 for문. 시작값과 끝값 선언 안해줘도됨. 배열, collection에서만 가능
System.out.printf("%4d", su);
}
System.out.println();
sc.close();
}
}
실행 화면
selection sort 10명 이내의 이름과 점수를 입력받아 점수가 높은 사람에서 낮은 사람순으로 출력
import java.util.Scanner;
public class Test3 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int i, j, inwon, temp1;
String temp2;
String[] name; // 배열크기가 입력값에 따라 달라지므로 크기 지정을 미리 할 수 없음.
int[] score;
do{
System.out.print("인원수[1~10?]");
inwon = sc.nextInt();
}while(inwon<1||inwon>10);
//배열의 객체 생성, 메모리 할당. new가 붙으면 객체를 생성했다 = 메모리상에 로딩시켰다.
name = new String[inwon];
score = new int[inwon];
//인원수 만큼 이름과 점수 입력
for(i=0;i<inwon;i++){
System.out.print((i+1)+"번째 이름?");
name[i]=sc.next();
System.out.print((i+1)+"번째 점수?");
score[i]=sc.nextInt();
}
//정렬
for(i=0;i<inwon-1;i++){
for(j=i+1;j<inwon;j++){
if(score[i]<score[j]){//점수오름차순
temp1=score[i];
score[i]=score[j];
score[j]=temp1;
temp2=name[i];
name[i]=name[j];
name[j]=temp2;
}
}
}
//출력. 확장for문은 배열1개일때만 가능. 예제에서는 2개의 배열이므로 사용불가
System.out.printf("이름 점수\n");
System.out.printf("-----------\n");
for(i=0;i<inwon;i++){
System.out.printf("%6s %4d\n",name[i],score[i]);
}
sc.close();
}//endmain
}//endclass
실행 화면
1~45까지의 수중 6개의 난수를 발생시켜 크기순으로 출력
import java.util.Random;
public class Test4 {
public static void main(String[] args) {
Random rd = new Random();
//난수생성 : Random class 사용자가 정해준 숫자범위 중에서 임의의 숫자를 하나 만들어낸다.
int[] num = new int[6];
int i, j, su, temp;
su = 0;
// while문은 몇번을 반복해야할지 모를 때 사용.
// 난수를 추출할때 동일한 난수가 나오게되면 다시 진행해야 함.
while (su < 6) {
num[su] = rd.nextInt(45) + 1; // 1~45를 꺼내라. 0부터 시작하므로 '+1'을 해줘야함
for (int n = 0; n < su; n++) { //이전 데이터와 전부 비교해야하므로 for문 사용
if (num[su] == num[n]) { // su:추출한 난수 데이터 갯수(배열의 인덱스), n번째 데이터와 동일하냐
su--; // 동일하다면 su를 줄이고 break문으로 나가라. 중복데이터 발생하면 여러번 돌릴 필요없이 다시 난수 뽑아내야 함
break;
}
}
su++;
}
// 선택정렬
for (i = 0; i < num.length - 1; i++) {
for (j = i + 1; j < num.length; j++) {
if (num[i] > num[j]) {
temp = num[i];
num[i] = num[j];
num[j] = temp;
}
}
}
// 출력
for (int n : num) {
System.out.printf("%4d", n);
}
System.out.println();
}
}
실행 화면
Selection sort 10명 이내의 이름과 점수를 입력받아 석차를 구하세요 석차가 높은 사람순으로 출력
import java.util.Scanner;
public class Test5 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int i, j, k, inwon;
String[] name;
int[] score;
int[] rank;
//인원수 입력
do{
System.out.print("인원수[1~10?]");
inwon = sc.nextInt();
}while(inwon<1||inwon>10);
//인원수에 따른 객체 생성
name = new String[inwon];
score = new int[inwon];
rank = new int[inwon];
//int형 배열에는 초기값 0 이 들어있음. 모두 1로 초기화
for(i=0;i<inwon;i++){
rank[i]=1;
}
//인원수 만큼 이름과 점수 입력
for(i=0;i<inwon;i++){
System.out.print("이름?");
name[i]=sc.next();
System.out.print("점수?");
score[i]=sc.nextInt();
}
//순위작성. if문 사용
for (i = 0; i < inwon - 1; i++) {
for (j = i + 1; j < inwon; j++) {
if (score[i] > score[j])
rank[j]++;
else if (score[i] < score[j])
rank[i]++;
}
}
//정렬 후 출력
System.out.printf("이름 점수 석차\n");
System.out.printf("-------------------\n");
for(k=1;k<=inwon;k++){
for(i=0;i<inwon;i++){
if(k==rank[i]){
System.out.printf("%6s %4d %4d\n",name[i],score[i],k);
}
}
}
sc.close();
}//endmain
}//endclass
실행 화면
5개의 정수를 입력받아 입력받은 수를 출력하고 입력받은 수중 가장 큰수와 적은수를 출력
import java.util.Scanner;
public class Test6 {
public static void main(String[] args) {
int num[] = new int[5];
int i, max, min;
System.out.print("정수 다섯개를 입력하세요: ");
Scanner sc = new Scanner(System.in);
for (i = 0; i < num.length; i++) {
num[i] = sc.nextInt();
}
max = min = num[0];
for (i = 0; i < num.length; i++) {
if (num[i] > max) {
max = num[i];
}
if (num[i] < min) {
min = num[i];
}
}
System.out.println("최댓값: " + max + ", 최소값: " + min);
sc.close();
}// endmain
}// endclass
실행 화면
1~10사이의 난수를 발생시켜 발생시킨 난수를 3번안에 알아 맞추는 게임 (3번안에 알아맞추지 못하면 발생된 난수를 출력)
import java.io.IOException;
import java.util.Random;
import java.util.Scanner;
public class Test7 {
public static void main(String[] args) throws IOException {
int i, j, k;
char play;
Random rd = new Random();
Scanner sc = new Scanner(System.in);
do {
i = rd.nextInt(10) + 1;
for (j = 1; j <= 3; j++) {
System.out.printf("1~10중에 정수를 입력하세요. [%d번째 기회] :", j);
k = sc.nextInt();
if (k == i) {
System.out.printf("정답은 %d. 정답입니다!\n",i);
break;
} else {
System.out.printf("오답입니다!\n");
}
}
System.out.printf("정답은 %d 입니다. ", i);
System.out.println("계속할래?[Y/N]");
play = (char) System.in.read();
} while (play == 'y' || play == 'Y');
sc.close();
}//end main
}//end class
실행 화면
1~3사이의 난수를 발생시켜 가위,바위,보 게임 프로그램 작성 1:가위, 2:바위, 3:보
import java.util.Random;
import java.util.Scanner;
public class Test8 {
public static void main(String[] args) {
Random rd = new Random();
Scanner sc = new Scanner(System.in);
int me, com;
String game[] = { "가위", "바위", "보" };
com = rd.nextInt(3) + 1;
do{
System.out.print("1:가위, 2:바위, 3:보 입니다. 숫자를 입력하세요. : ");
me = sc.nextInt();
}while(me<1||me>3);
System.out.println("컴퓨터: " + game[com - 1] + ", 사람: " + game[me - 1]);
if (me == com) {
System.out.println("비겼습니다.");
} else if ((me == 1 && com == 3) || (me == 2 && com == 1)|| (me == 3 && com == 2)) {
System.out.println("당신이 이겼습니다.");
} else {
System.out.println("컴퓨터가 이겼습니다.");
}
/*
//가위바위보 수학 공식
if (me == com) {
System.out.println("비겼습니다.");
}else if((me+2)%3==com){
System.out.println("당신이 이겼습니다.");
}else{
System.out.println("컴퓨터가 이겼습니다.");
}
*/
sc.close();
}
}
실행 화면
지역변수와 전역변수의 초기값
import com.day06.Rect;
public class Test9 {
public static void main(String[] args) {
Rect usa = new Rect();//패키지가 달라서 import 시켜야함
usa.input();
int a = usa.area();
int l = usa.length();
usa.print(a, l);
//전역변수: 초기값 - 0
//지역변수: 초기값 - 쓰레기값 가지고 있음
}
}
실행 화면
'Dev > Java' 카테고리의 다른 글
[java] static변수, 변수 초기화 방법, Overloading (0) | 2019.01.22 |
---|---|
[java] 전역/지역변수, 버블정렬,구구단만들기 (0) | 2019.01.22 |
[java] 배열, 달력만들기 (0) | 2019.01.21 |
[java] for문, switch문 (0) | 2019.01.21 |
[java] 반복문 (0) | 2019.01.21 |