뉴렉처/자바

[뉴렉처/자바] ★배열 2023.06.22

2023. 6. 22. 13:11
목차
  1. 1.제일 큰 값 찾기
  2. 1.1 자리 뺏기
  3. 1.2 자리 바꾸기
  4. 2. 최솟값의 '인덱스' 찾기
  5.  
  6. 3.정렬하기
  7. 3.1 버블정렬
  8. 3.2 선택정렬

1.제일 큰 값 찾기

1.1 자리 뺏기

package ex06.array.basic;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.charset.Charset;
import java.util.Scanner;

public class Program {

	public static void main(String[] args) throws IOException {
		int[] nums = new int[100]; // nums의 출력값 변화를 살펴보자. 그러면 전역변수와 지역변수의 알 수 있다.
		
		int idx = -1; // 우리가 원하는 숫자의 위치를 찾기 위한 변수. 왜 전역변수로 선언됐는지 생각하자.
		int size=0; // 몇번 출력됐는지 확인하기 위해 변수 size를 선언한다. 공유되는 변수. 왜 공유되는지 생각하자.
		
//		1.값 로드하기
		{
			FileInputStream fis = new FileInputStream("res/array/data.txt"); // 파일을 읽어온다.
			Scanner fscan = new Scanner(fis); // 파일에 적힌 데이터를 읽어온다.
			 
			for(int i=0; fscan.hasNext(); i++) { //배열의 0번째부터 배열에 데이터가 존재하는 위치까지 데이터를 불러온다.
//				String num= sc.next(); //문자열을 불러온다.  
//			    nums[i] = Integer.parseInt(num); // 문자열을 정수로 바꾼다. 
				int num = fscan.nextInt(); //문자열을 불러와 int로 변환시켜 num에 넣는다.
				nums[i] = num; // 배열에 문자열을 넣는다.
				size++; // 반복문을 돌 때 마다 size를 하나씩 증가시켜 배열에 데이터가 몇 개 있는지 알 수 있다.
			}
			
			
			fscan.close();
			fis.close();
		}
		
// 		nums 출력하기
		{
		  for(int i=0; i<size; i++)
			System.out.printf("%d,", nums[i]);
		  System.out.println();
		}
		
//		2.위치 찾기
		{
//			for(int i=0; i<size; i++) {
//				idx++;
//				int search = nums[i];
//				if(search==90) {
//					System.out.println("숫자 90은"+" "+idx+"번째 자리에 있지롱!");
//					break; // break문 까먹지 말자. 이거 까먹으면 출력문만 찍고 계속 반복문 돈다.
//				}
//			}
			
//			break문 사용
			for(int i=0; i<size; i++) {
				idx++;
				if(nums[i]==90) {
					idx = i;
					break;
				}
			}
			System.out.println("인덱스의 값은"+idx+"입니다.");
		}
		
//		3.숫자 90과 0번째 위치에 있는 숫자 값 바꾸기
		{
			int tmp; // 빈 공간 하나를 만든다.
			tmp = nums[0]; // 0번째에 있는 숫자를 빈 공간에 넣는다.
			nums[0] = nums[idx]; // 90숫자를 0번째에 넣는다.
			nums[idx] = tmp; //빈공간에 있는 숫자를 숫자 90이 있던 자리에 넣는다.
			System.out.println(nums[0]+" "+nums[idx]);
		}
		
 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★       
		// 제일 큰 값 찾기
		{ 
			int max = nums[0];
			// 2번째(=인덱스 1) 숫자부터 겨루기를 해서 왕좌를 탈환하라.
			// 몇 번의 반복? size-1
			for(int i=0; i<size-1; i++) {
				if(nums[i+1]>max) {
					max = nums[i+1];
				}
			}
			System.out.printf("max: %d\n", max);
		}
        
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
		
//		4.파일에 값 저장하기
		{
			FileOutputStream fos = new FileOutputStream("res/array/dataPrint.txt"); 
			PrintWriter fout2 = new PrintWriter(fos, true, Charset.forName("UTF-8"));
			
			for(int i=0; i<size; i++) { //반복의 제한을 어떻게 설정할건가?
				fout2.printf("%d,",nums[i]);
			}
			
			fos.close();
		}
		
	}
}

 

1.2 자리 바꾸기

package ex06.array.basic;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.charset.Charset;
import java.util.Scanner;

public class Program {

	public static void main(String[] args) throws IOException {
		int[] nums = new int[100]; // nums의 출력값 변화를 살펴보자. 그러면 전역변수와 지역변수의 알 수 있다.
		
		int idx = -1; // 우리가 원하는 숫자의 위치를 찾기 위한 변수. 왜 전역변수로 선언됐는지 생각하자.
		int size=0; // 몇번 출력됐는지 확인하기 위해 변수 size를 선언한다. 공유되는 변수. 왜 공유되는지 생각하자.
		
//		1.값 로드하기
		{
			FileInputStream fis = new FileInputStream("res/array/data.txt"); // 파일을 읽어온다.
			Scanner fscan = new Scanner(fis); // 파일에 적힌 데이터를 읽어온다.
			 
			for(int i=0; fscan.hasNext(); i++) { //배열의 0번째부터 배열에 데이터가 존재하는 위치까지 데이터를 불러온다.
//				String num= sc.next(); //문자열을 불러온다.  
//			    nums[i] = Integer.parseInt(num); // 문자열을 정수로 바꾼다. 
				int num = fscan.nextInt(); //문자열을 불러와 int로 변환시켜 num에 넣는다.
				nums[i] = num; // 배열에 문자열을 넣는다.
				size++; // 반복문을 돌 때 마다 size를 하나씩 증가시켜 배열에 데이터가 몇 개 있는지 알 수 있다.
			}
			
			
			fscan.close();
			fis.close();
		}
		
//// 		nums 출력하기
//		{
//		  for(int i=0; i<size; i++)
//			System.out.printf("%d,", nums[i]);
//		  System.out.println();
//		}
		
//		2.위치 찾기
		{
//			for(int i=0; i<size; i++) {
//				idx++;
//				int search = nums[i];
//				if(search==90) {
//					System.out.println("숫자 90은"+" "+idx+"번째 자리에 있지롱!");
//					break; // break문 까먹지 말자. 이거 까먹으면 출력문만 찍고 계속 반복문 돈다.
//				}
//			}
			
////			break문 사용
//			for(int i=0; i<size; i++) {
//				idx++;
//				if(nums[i]==90) {
//					idx = i;
//					break;
//				}
//			}
//			System.out.println("인덱스의 값은"+idx+"입니다.");
		}
		
//		3.숫자 90과 0번째 위치에 있는 숫자 값 바꾸기
//		{
//			int tmp; // 빈 공간 하나를 만든다.
//			tmp = nums[0]; // 0번째에 있는 숫자를 빈 공간에 넣는다.
//			nums[0] = nums[idx]; // 90숫자를 0번째에 넣는다.
//			nums[idx] = tmp; //빈공간에 있는 숫자를 숫자 90이 있던 자리에 넣는다.
//			System.out.println(nums[0]+" "+nums[idx]);
//		}
		
		// 제일 큰 값 찾기
//		{ 
//			int max = nums[0];
//			// 2번째(=인덱스 1) 숫자부터 겨루기를 해서 왕좌를 탈환하라.
//			// 몇 번의 반복? size-1
//			for(int i=0; i<size-1; i++) {
//				if(nums[i+1]>max) {
//					max = nums[i+1];
//				}
//			}
//			System.out.printf("max: %d\n", max);
//		}
		
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★        
		// 자리 바꾸기 방식으로 큰 값 찾기
		{
			
			for(int i=0; i<size-1; i++) {
				if(nums[i]>nums[i+1]) {
					int temp;
					temp = nums[i];
					nums[i] = nums[i+1];
					nums[i+1] = temp;
				}			
			}
			System.out.printf("max : %d\n", nums[size-1]);		
		}
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★        
		
//		4.파일에 값 저장하기
		{
			FileOutputStream fos = new FileOutputStream("res/array/dataPrint.txt"); 
			PrintWriter fout2 = new PrintWriter(fos, true, Charset.forName("UTF-8"));
			
			for(int i=0; i<size; i++) { //반복의 제한을 어떻게 설정할건가?
				fout2.printf("%d,",nums[i]);
			}
			
			fos.close();
		}
		
	}
}

 

2. 최솟값의 '인덱스' 찾기

2.1 자리 뺏기

최초 인덱스는 0번째 

package ex06.array.basic;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.charset.Charset;
import java.util.Scanner;

public class Program {

	public static void main(String[] args) throws IOException {
		int[] nums = new int[100]; // nums의 출력값 변화를 살펴보자. 그러면 전역변수와 지역변수의 알 수 있다.
		
		int idx = -1; // 우리가 원하는 숫자의 위치를 찾기 위한 변수. 왜 전역변수로 선언됐는지 생각하자.
		int size=0; // 몇번 출력됐는지 확인하기 위해 변수 size를 선언한다. 공유되는 변수. 왜 공유되는지 생각하자.
		
//		1.값 로드하기
		{
			FileInputStream fis = new FileInputStream("res/array/data.txt"); // 파일을 읽어온다.
			Scanner fscan = new Scanner(fis); // 파일에 적힌 데이터를 읽어온다.
			 
			for(int i=0; fscan.hasNext(); i++) { //배열의 0번째부터 배열에 데이터가 존재하는 위치까지 데이터를 불러온다.
//				String num= sc.next(); //문자열을 불러온다.  
//			    nums[i] = Integer.parseInt(num); // 문자열을 정수로 바꾼다. 
				int num = fscan.nextInt(); //문자열을 불러와 int로 변환시켜 num에 넣는다.
				nums[i] = num; // 배열에 문자열을 넣는다.
				size++; // 반복문을 돌 때 마다 size를 하나씩 증가시켜 배열에 데이터가 몇 개 있는지 알 수 있다.
			}
			
			
			fscan.close();
			fis.close();
		}
		
//// 		nums 출력하기
//		{
//		  for(int i=0; i<size; i++)
//			System.out.printf("%d,", nums[i]);
//		  System.out.println();
//		}
		
//		2.위치 찾기
		{
//			for(int i=0; i<size; i++) {
//				idx++;
//				int search = nums[i];
//				if(search==90) {
//					System.out.println("숫자 90은"+" "+idx+"번째 자리에 있지롱!");
//					break; // break문 까먹지 말자. 이거 까먹으면 출력문만 찍고 계속 반복문 돈다.
//				}
//			}
			
////			break문 사용
//			for(int i=0; i<size; i++) {
//				idx++;
//				if(nums[i]==90) {
//					idx = i;
//					break;
//				}
//			}
//			System.out.println("인덱스의 값은"+idx+"입니다.");
		}
		
//		3.숫자 90과 0번째 위치에 있는 숫자 값 바꾸기
//		{
//			int tmp; // 빈 공간 하나를 만든다.
//			tmp = nums[0]; // 0번째에 있는 숫자를 빈 공간에 넣는다.
//			nums[0] = nums[idx]; // 90숫자를 0번째에 넣는다.
//			nums[idx] = tmp; //빈공간에 있는 숫자를 숫자 90이 있던 자리에 넣는다.
//			System.out.println(nums[0]+" "+nums[idx]);
//		}
		
		// 제일 큰 값 찾기
//		{ 
//			int max = nums[0];
//			// 2번째(=인덱스 1) 숫자부터 겨루기를 해서 왕좌를 탈환하라.
//			// 몇 번의 반복? size-1
//			for(int i=0; i<size-1; i++) {
//				if(nums[i+1]>max) {
//					max = nums[i+1];
//				}
//			}
//			System.out.printf("max: %d\n", max);
//		}
		
//		// 자리 바꾸기 방식으로 큰 값 찾기
//		{
//			
//			for(int i=0; i<size-1; i++) {
//				if(nums[i]>nums[i+1]) {
//					int temp;
//					temp = nums[i];
//					nums[i] = nums[i+1];
//					nums[i+1] = temp;
//				}			
//			}
//			System.out.printf("max : %d\n", nums[size-1]);		
//		}
		

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
//최솟값의 인덱스 찾기
		{
			int minIndex = 0; //최초 인덱스를 설정한다. 최초 인덱스는 0
			for(int i=0; i<size-1; i++) {
				if(nums[minIndex]>nums[i+1]) { // 설정한 인덱스 다음 나오는 데이터가 인덱스에 담긴 값보다 더 작으면 그 값의 인덱스'i+1'를 minIndex에 넣는다.
					minIndex = i+1;
				}
				System.out.println(minIndex);
			}
			System.out.printf("min index : %d\n", minIndex);
		}
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
//		4.파일에 값 저장하기
		{
			FileOutputStream fos = new FileOutputStream("res/array/dataPrint.txt"); 
			PrintWriter fout2 = new PrintWriter(fos, true, Charset.forName("UTF-8"));
			
			for(int i=0; i<size; i++) { //반복의 제한을 어떻게 설정할건가?
				fout2.printf("%d,",nums[i]);
			}
			
			fos.close();
		}
		
	}
}

 

3.정렬하기

3.1 버블정렬

출처: https://en.wikipedia.org/wiki/Bubble_sort

package ex06.array.basic;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.charset.Charset;
import java.util.Scanner;

public class Program {

	public static void main(String[] args) throws IOException {
		int[] nums = new int[100]; // nums의 출력값 변화를 살펴보자. 그러면 전역변수와 지역변수의 알 수 있다.
		
		int idx = -1; // 우리가 원하는 숫자의 위치를 찾기 위한 변수. 왜 전역변수로 선언됐는지 생각하자.
		int size=0; // 몇번 출력됐는지 확인하기 위해 변수 size를 선언한다. 공유되는 변수. 왜 공유되는지 생각하자.
		
//		1.값 로드하기
		{
			FileInputStream fis = new FileInputStream("res/array/data.txt"); // 파일을 읽어온다.
			Scanner fscan = new Scanner(fis); // 파일에 적힌 데이터를 읽어온다.
			 
			for(int i=0; fscan.hasNext(); i++) { //배열의 0번째부터 배열에 데이터가 존재하는 위치까지 데이터를 불러온다.
//				String num= sc.next(); //문자열을 불러온다.  
//			    nums[i] = Integer.parseInt(num); // 문자열을 정수로 바꾼다. 
				int num = fscan.nextInt(); //문자열을 불러와 int로 변환시켜 num에 넣는다.
				nums[i] = num; // 배열에 문자열을 넣는다.
				size++; // 반복문을 돌 때 마다 size를 하나씩 증가시켜 배열에 데이터가 몇 개 있는지 알 수 있다.
			}
			
			
			fscan.close();
			fis.close();
		}
		
//// 		nums 출력하기
//		{
//		  for(int i=0; i<size; i++)
//			System.out.printf("%d,", nums[i]);
//		  System.out.println();
//		}
		
//		2.위치 찾기
		{
//			for(int i=0; i<size; i++) {
//				idx++;
//				int search = nums[i];
//				if(search==90) {
//					System.out.println("숫자 90은"+" "+idx+"번째 자리에 있지롱!");
//					break; // break문 까먹지 말자. 이거 까먹으면 출력문만 찍고 계속 반복문 돈다.
//				}
//			}
			
////			break문 사용
//			for(int i=0; i<size; i++) {
//				idx++;
//				if(nums[i]==90) {
//					idx = i;
//					break;
//				}
//			}
//			System.out.println("인덱스의 값은"+idx+"입니다.");
		}
		
//		3.숫자 90과 0번째 위치에 있는 숫자 값 바꾸기
//		{
//			int tmp; // 빈 공간 하나를 만든다.
//			tmp = nums[0]; // 0번째에 있는 숫자를 빈 공간에 넣는다.
//			nums[0] = nums[idx]; // 90숫자를 0번째에 넣는다.
//			nums[idx] = tmp; //빈공간에 있는 숫자를 숫자 90이 있던 자리에 넣는다.
//			System.out.println(nums[0]+" "+nums[idx]);
//		}

//		-------------------------------------------------- 필수 프로그래밍 기법---------------------------------------
		// 제일 큰 값 찾기
//		{ 
//			int max = nums[0];
//			// 2번째(=인덱스 1) 숫자부터 겨루기를 해서 왕좌를 탈환하라.
//			// 몇 번의 반복? size-1
//			for(int i=0; i<size-1; i++) {
//				if(nums[i+1]>max) {
//					max = nums[i+1];
//				}
//			}
//			System.out.printf("max: %d\n", max);
//		}
		
//		// 자리 바꾸기 방식으로 큰 값 찾기
//		{
//			
//			for(int i=0; i<size-1; i++) {
//				if(nums[i]>nums[i+1]) {
//					int temp;
//					temp = nums[i];
//					nums[i] = nums[i+1];
//					nums[i+1] = temp;
//				}			
//			}
//			System.out.printf("max : %d\n", nums[size-1]);		
//		}
		
//		//최솟값의 인덱스 찾기
//		{
//			int minIndex = 0; //최초 인덱스를 설정한다. 최초 인덱스는 0
//			for(int i=0; i<size-1; i++) {
//				if(nums[minIndex]>nums[i+1]) { // 설정한 인덱스 다음 나오는 데이터가 인덱스에 담긴 값보다 더 작으면 그 값의 인덱스'i+1'를 minIndex에 넣는다.
//					minIndex = i+1;
//				}
//				System.out.println(minIndex);
//			}
//			System.out.printf("min index : %d\n", minIndex);
//		}
		
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
		//버블 정렬
		{
			// 1등찾기 -> 비교를 위한 반복횟수 size-1
			// 2등찾기 -> 비교를 위한 반복횟수 size-2
			// n등찾기 -> 비교를 위한 반복횟수 size-n => 그림을 그려보면 쉽게 알 수 있다.
			
			for(int j=0; j<size-1; j++) // j는 값의 비교를 통해 최종적으로 결정된 숫자로 인해 제외 해야하는 수다. 숫자가 결정됐기에 반복 횟수에서 빠진다(size-1-i)
				for(int i=0; i<(size-1)-j; i++) //size-1은 비교횟수
					if(nums[i]>nums[i+1]) { // 자리를 바꿔 큰 값을 오른쪽으로 보내는 코드
						int temp;
						temp = nums[i];
						nums[i] = nums[i+1];
						nums[i+1] = temp;
					}	
		}
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★		
		
//		4.파일에 값 저장하기
		{
			FileOutputStream fos = new FileOutputStream("res/array/dataPrint.txt"); 
			PrintWriter fout2 = new PrintWriter(fos, true, Charset.forName("UTF-8"));
			
			for(int i=0; i<size; i++) { //반복의 제한을 어떻게 설정할건가?
				fout2.printf("%d,",nums[i]);
			}
			
			fos.close();
		}
		
	}
}

 

3.2 선택정렬

배열이 끝날 때 까지 반복한다.

package ex06.array.basic;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.charset.Charset;
import java.util.Scanner;

public class Program {

	public static void main(String[] args) throws IOException {
		int[] nums = new int[100]; // nums의 출력값 변화를 살펴보자. 그러면 전역변수와 지역변수의 알 수 있다.
		
		int idx = -1; // 우리가 원하는 숫자의 위치를 찾기 위한 변수. 왜 전역변수로 선언됐는지 생각하자.
		int size=0; // 몇번 출력됐는지 확인하기 위해 변수 size를 선언한다. 공유되는 변수. 왜 공유되는지 생각하자.
		
//		1.값 로드하기
		{
			FileInputStream fis = new FileInputStream("res/array/data.txt"); // 파일을 읽어온다.
			Scanner fscan = new Scanner(fis); // 파일에 적힌 데이터를 읽어온다.
			 
			for(int i=0; fscan.hasNext(); i++) { //배열의 0번째부터 배열에 데이터가 존재하는 위치까지 데이터를 불러온다.
//				String num= sc.next(); //문자열을 불러온다.  
//			    nums[i] = Integer.parseInt(num); // 문자열을 정수로 바꾼다. 
				int num = fscan.nextInt(); //문자열을 불러와 int로 변환시켜 num에 넣는다.
				nums[i] = num; // 배열에 문자열을 넣는다.
				size++; // 반복문을 돌 때 마다 size를 하나씩 증가시켜 배열에 데이터가 몇 개 있는지 알 수 있다.
			}
			
			
			fscan.close();
			fis.close();
		}
		
//// 		nums 출력하기
//		{
//		  for(int i=0; i<size; i++)
//			System.out.printf("%d,", nums[i]);
//		  System.out.println();
//		}
		
//		2.위치 찾기
		{
//			for(int i=0; i<size; i++) {
//				idx++;
//				int search = nums[i];
//				if(search==90) {
//					System.out.println("숫자 90은"+" "+idx+"번째 자리에 있지롱!");
//					break; // break문 까먹지 말자. 이거 까먹으면 출력문만 찍고 계속 반복문 돈다.
//				}
//			}
			
////			break문 사용
//			for(int i=0; i<size; i++) {
//				idx++;
//				if(nums[i]==90) {
//					idx = i;
//					break;
//				}
//			}
//			System.out.println("인덱스의 값은"+idx+"입니다.");
		}
		
//		3.숫자 90과 0번째 위치에 있는 숫자 값 바꾸기
//		{
//			int tmp; // 빈 공간 하나를 만든다.
//			tmp = nums[0]; // 0번째에 있는 숫자를 빈 공간에 넣는다.
//			nums[0] = nums[idx]; // 90숫자를 0번째에 넣는다.
//			nums[idx] = tmp; //빈공간에 있는 숫자를 숫자 90이 있던 자리에 넣는다.
//			System.out.println(nums[0]+" "+nums[idx]);
//		}

//		-------------------------------------------------- 필수 프로그래밍 기법---------------------------------------
		// 제일 큰 값 찾기
//		{ 
//			int max = nums[0];
//			// 2번째(=인덱스 1) 숫자부터 겨루기를 해서 왕좌를 탈환하라.
//			// 몇 번의 반복? size-1
//			for(int i=0; i<size-1; i++) {
//				if(nums[i+1]>max) {
//					max = nums[i+1];
//				}
//			}
//			System.out.printf("max: %d\n", max);
//		}
		
//		// 자리 바꾸기 방식으로 큰 값 찾기
//		{
//			
//			for(int i=0; i<size-1; i++) {
//				if(nums[i]>nums[i+1]) {
//					int temp;
//					temp = nums[i];
//					nums[i] = nums[i+1];
//					nums[i+1] = temp;
//				}			
//			}
//			System.out.printf("max : %d\n", nums[size-1]);		
//		}
		
//		//최솟값의 인덱스 찾기
//		{
//			int minIndex = 0; //최초 인덱스를 설정한다. 최초 인덱스는 0
//			for(int i=0; i<size-1; i++) {
//				if(nums[minIndex]>nums[i+1]) { // 설정한 인덱스 다음 나오는 데이터가 인덱스에 담긴 값보다 더 작으면 그 값의 인덱스'i+1'를 minIndex에 넣는다.
//					minIndex = i+1;
//				}
//				System.out.println(minIndex);
//			}
//			System.out.printf("min index : %d\n", minIndex);
//		}
		
		//버블 정렬
//		{
//			// 1등찾기 -> 비교를 위한 반복횟수 size-1
//			// 2등찾기 -> 비교를 위한 반복횟수 size-2
//			// n등찾기 -> 비교를 위한 반복횟수 size-n => 그림을 그려보면 쉽게 알 수 있다.
//			
//			for(int j=0; j<size-1; j++) // j는 값의 비교를 통해 최종적으로 결정된 숫자로 인해 제외 해야하는 수다. 숫자가 결정됐기에 반복 횟수에서 빠진다(size-1-i)
//				for(int i=0; i<(size-1)-j; i++) //size-1은 비교횟수
//					if(nums[i]>nums[i+1]) { // 자리를 바꿔 큰 값을 오른쪽으로 보내는 코드
//						int temp;
//						temp = nums[i];
//						nums[i] = nums[i+1];
//						nums[i+1] = temp;
//					}	
//		}
		
		//선택정렬
		{
★★★★★★★★★★★★★★★★<선택정렬 일반화 코드>★★★★★★★★★★★★★★★★	
			for(int j=0; j<size-1; j++) {
				{   // step1.최솟값의 인덱스를 찾는다.
					int firstArr=j;// 배열의 첫번 째 위치
					int minIndex = j; //최초 인덱스를 설정한다. 최초 인덱스는 0
					for(int i=0; i<size-1-firstArr; i++) {
						if(nums[minIndex]>nums[i+1+j]) { // 설정한 인덱스 다음 나오는 데이터가 인덱스에 담긴 값보다 더 작으면 그 값의 인덱스'i+1'를 minIndex에 넣는다.
							minIndex = i+1+j;
						}
					}
					
					// step2.최솟값과 첫번째(인덱스0) 자리의 숫자를 바꾼다.
					int tmp;
					tmp = nums[firstArr];
					nums[firstArr] = nums[minIndex];
					nums[minIndex] = tmp;
				}
			}
			
★★★★★★★★★★★★★★★★<선택정렬 이해과정 코드>★★★★★★★★★★★★★★★★
			//1회
			
            // step1.최솟값의 인덱스를 찾는다.
			{   
//				int firstArr=0;// 배열의 첫번 째 위치
//				int minIndex = 0; //최초 인덱스를 설정한다. 최초 인덱스는 0
//				for(int i=0; i<size-1-firstArr; i++) { // size의 범주가 이동하면서 비교하려는 데이터의 수를 넘어선다. 그래서 -firstArr를 한다.
//					if(nums[minIndex]>nums[i+1]) { // 설정한 인덱스 다음 나오는 데이터가 인덱스에 담긴 값보다 더 작으면 그 값의 인덱스'i+1'를 minIndex에 넣는다.
//						minIndex = i+1;
//					}
//				}
//				
//				// step2.최솟값과 첫번째(인덱스0) 자리의 숫자를 바꾼다.
//				int tmp;
//				tmp = nums[firstArr];
//				nums[firstArr] = nums[minIndex];
//				nums[minIndex] = tmp;
//			}
			
			//2회
//			{   // step1.최솟값의 인덱스를 찾는다.
//				int firstArr=1; //1회에서 0번째 값을 처리했으므로(더이상 0번째는 신경x) 2회의 첫번째 배열위치는 1로 설정한다. 
//				int minIndex = 1; //최초 인덱스를 설정한다. 최초 인덱스는 배열의 0번째는 이미 끝났으므로 최초 인덱스는 1
//				for(int i=0; i<size-1-firstArr; i++) { 
//					if(nums[minIndex]>nums[i+2]) { // 설정한 인덱스 다음 나오는 데이터가 인덱스에 담긴 값보다 더 작으면 그 값의 인덱스'i+1'를 minIndex에 넣는다.
//						minIndex = i+2;
//					}
//				}
//				
//				// step2.최솟값과 첫번째(인덱스0) 자리의 숫자를 바꾼다.
//				int tmp;
//				tmp = nums[firstArr];
//				nums[firstArr] = nums[minIndex];
//				nums[minIndex] = tmp;
//			}
//			
//			//3회
//			{   // step1.최솟값의 인덱스를 찾는다.
//				int firstArr=2; //1회와 2회에서 0번째 값을 처리했으므로(더이상 0번째는 신경x) 2회의 첫번째 배열위치는 1로 설정한다. 
//				int minIndex = 2; //최초 인덱스를 설정한다. 최초 인덱스는 배열의 0번째는 이미 끝났으므로 최초 인덱스는 2
//				for(int i=0; i<size-1-firstArr; i++) { 
//					if(nums[minIndex]>nums[i+3]) { // 설정한 인덱스 다음 나오는 데이터가 인덱스에 담긴 값보다 더 작으면 그 값의 인덱스'i+1'를 minIndex에 넣는다.
//						minIndex = i+3;
//					}
//				}
//				
//				// step2.최솟값과 첫번째 자리의 숫자를 바꾼다.
//				int tmp;
//				tmp = nums[firstArr];
//				nums[firstArr] = nums[minIndex];
//				nums[minIndex] = tmp;
//			}
		}
		
		
//		4.파일에 값 저장하기
		{
			FileOutputStream fos = new FileOutputStream("res/array/dataPrint.txt"); 
			PrintWriter fout2 = new PrintWriter(fos, true, Charset.forName("UTF-8"));
			
			for(int i=0; i<size; i++) { //배열의 값을 파일에 저장한다.
				fout2.printf("%d,",nums[i]);
			}
			
			fos.close();
		}
		
	}
}

4.느낀점

 배열을 활용한 다양한 문제를 풀어봤다. 문제를 풀면서 가장 많이 막히고 이해가 안갔던 부분은 '인덱스'다. 배열에서 인덱스가 무엇을 의미하고 어떻게 활용되는지 파악하는 게 배열을 활용할 때 중요하게 생각해야할 포인트다. 인덱스를 잘못이해하고 설정하면, 프로그래밍이 망가진다.

'뉴렉처 > 자바' 카테고리의 다른 글

[뉴렉처/자바] ★생성자(생성자 오버로드/캡슐화/Getters와Setters 2023.07.05  (0) 2023.07.05
[뉴렉처/자바] ★객체지향(객체와개체/개체의 속성/static메소드와 인스턴스 메소드)/ 생성자)2023.07.04  (0) 2023.07.04
[뉴렉처/자바] ★배열 2023.06.21  (0) 2023.06.21
[뉴렉처/자바] ★반복문과 제어문 2023.06.20  (0) 2023.06.20
[뉴렉처/자바]★반복문과 제어문 2023.06.19  (1) 2023.06.19
  1. 1.제일 큰 값 찾기
  2. 1.1 자리 뺏기
  3. 1.2 자리 바꾸기
  4. 2. 최솟값의 '인덱스' 찾기
  5.  
  6. 3.정렬하기
  7. 3.1 버블정렬
  8. 3.2 선택정렬
'뉴렉처/자바' 카테고리의 다른 글
  • [뉴렉처/자바] ★생성자(생성자 오버로드/캡슐화/Getters와Setters 2023.07.05
  • [뉴렉처/자바] ★객체지향(객체와개체/개체의 속성/static메소드와 인스턴스 메소드)/ 생성자)2023.07.04
  • [뉴렉처/자바] ★배열 2023.06.21
  • [뉴렉처/자바] ★반복문과 제어문 2023.06.20
각시탈코더
각시탈코더
각시탈코더각시탈코더 님의 블로그입니다.
각시탈코더
각시탈코더
각시탈코더
전체
오늘
어제
  • 분류 전체보기 (203)
    • java (46)
      • 객체지향 (20)
      • 기본문법 (8)
      • 자바의 정석 연습문제 오답노트 (9)
      • 백준 알고리즘 (9)
    • Spring (17)
      • SpringMVC (8)
      • Spring DI와 AOP (5)
      • REST API와 Ajax (1)
      • Spring 프로젝트 (1)
      • Spring Security (0)
    • DB (47)
      • Oracle (15)
      • SQL오답노트 (25)
      • 튜닝 (0)
      • ERD (1)
      • DB 모델링 (5)
    • Servlet & JSP (3)
    • JDBC (2)
      • 기본 (1)
      • 스프링JDBC (1)
    • MyBatis (2)
    • JavaScript (2)
      • 코딩애플 (0)
      • 문법 (1)
    • React (0)
      • 코딩애플 (0)
    • HTML (0)
      • 모던 웹을 위한 HTML5+CSS3 바이블 (0)
    • CSS (0)
      • 모던 웹을 위한 HTML5+CSS3 바이블 (0)
    • Linux (0)
    • Git & GitHub (2)
      • Git (1)
    • CS (19)
      • 네트워크 (6)
      • HTTP (7)
      • 컴퓨터구조 (0)
      • 자료구조와 알고리즘 (2)
      • 기타 (4)
    • 개발설정 (2)
    • 기술면접 (0)
      • JAVA (0)
      • Spring (0)
      • DB (0)
      • 네트워크 (0)
      • 공통 (0)
    • 프로젝트 (2)
      • 게시판만들기 (2)
    • 기혁씨의 삽질표류기 (28)
    • 참고자료 (2)
      • 국비수업 (0)
      • 당당 프로젝트 (1)
    • 뉴렉처 (17)
      • 자바 (11)
      • 자바스크립트 (3)
      • 키워드 (0)
      • 숙제 (0)
      • CSS (0)
      • DB (3)
      • 서블릿 (0)
      • 스프링 (0)
      • DOM (0)
    • 내가 만든 학습그림 (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 오라클
  • 알고리즘
  • 스프링
  • SQL
  • 국비수업
  • 코딩
  • 공부
  • 백준
  • 웹프로그래밍
  • 백엔드
  • 개발자
  • 연습문제
  • 네트워크
  • 자바의정석
  • 모두의네트워크
  • 객체지향
  • 뉴렉처
  • 배열
  • 프로그래머스
  • 에러
  • 자바
  • Oracle
  • 서브쿼리
  • spring
  • 쿼리
  • It
  • db
  • Java
  • 자바의정석기초편
  • 오류

최근 댓글

최근 글

hELLO · Designed By 정상우.
각시탈코더
[뉴렉처/자바] ★배열 2023.06.22
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.