[JAVA] Day 5 - 배열 / 정렬

sue·2023년 11월 20일

📒국비학원 [JAVA]

목록 보기
3/20
post-thumbnail

배열

  • for문이랑 거의 같이 쓰게 됩니다.
  • int num[ ] = int[ ] num
  • new.length = 개수를 알고 싶을 때 (최대값대신 쓰임)
  • int num[ ] = new int[x] ← [x]는 자료형 int의 개수를 나타냅니다.

🔎 [Eclipse] - [package] - [class] 생성


📌 Note Code


  • Scanner을 사용할 때 for문 - num[i] = sc.nextInt(); 으로 받을 수 있음
  • num[x] = num[y] ← x번지 방에 y번지의 값을 넣고싶을 때
  • int[x] = 10; ← x번지 방에 값 10을 넣고싶을 때
  • int a; a=num[x] ← a값 초기화 안한 상태에서 num[x]의 값을 넣을 수 있습니다.
  • for( ){출력코드 ("num ["+i+"] = "num [i])} → 숫자가 적을 땐 괜찮지만, 숫자가 많을 땐 다 쓰기 힘드므로 간편하게 for문을 활용해서 씁니다. (이 때 최대값에 new.length 이용하기)

Test1. 사용자에게 수 입력을 받아 배열 개수 및 값 확인

💻 입력

import java.util.Scanner;

public class Test1 {

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in); //Scanner 특징 : 사용자에게 값을 받음
		int[] num = new int[6]; // 몇 개의 수 입력할지? [개수]
				
		System.out.print("6개 수입력해봐");
	
		for(int i=1;i<num.length;i++) { 
			num[i]= sc.nextInt();
		}
		
		for(int i=1;i<num.length;i++) {
			System.out.println("num["+i+"] = "+ num[i]);
		}
		
		System.out.print("배열의 개수 : "+num.length+"개");
	}

}

💡 **출력**
6개 수입력해봐1 2 3 4 5 6
num[1] = 1
num[2] = 2
num[3] = 3
num[4] = 4
num[5] = 5
배열의 개수 : 6개


📌 Note Code



Test2-1. 만년 달력 만들기

💻 입력

import java.util.Scanner;

public class Test2 {

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);

		// int months[] = new int[12]; // months 1월에는 31, 2월에는 28.29일~
		int months[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; // 배열을 만듦과 동시에 변수의 값에 바로 초기화하는 방법{,,,}
		int y, m, nalsu, i, week; // week[0~6 나머지]

		do {
			System.out.print("년도?");// 2023
			y = sc.nextInt();
		} while (y < 1); // 안돼요~ true의 반대인 false값이 나오게 적어야함.

		do {
			System.out.print("월?");
			m = sc.nextInt();
		} while (m < 1 || m > 12);

		// (윤년은 4번에 한번씩- 2월29일)
		// y년이 윤년(인지 확인하는 공식 -> 2월 28일? or 29일?
		if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0) { // &&먼저 , y%400==0이면 윤년임 -> true면 윤년임
			months[1] = 29;
			// System.out.print("윤년이다");
		}

		// 전년도(y-1)년 12월 31일까지의 날수를 구하여라
		nalsu = (y - 1) * 365 + (y - 1) / 4 - (y - 1) / 100 + (y - 1) / 400;// &&는 빼기, ||는 더하기

		// int yy = (y-1)/4 - (y-1)/100 + (y-1)/400;
		// System.out.print("날수 : "+nalsu+", 윤년 : "+yy);

		// y년(m-1)월까지의 날수
		// index(번지) : 0 1 2 3 4 5 6 7 8 9 10 11
		// 배열 : 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
		// 월(months) : 1 2 3 4 5 6 7 8 9 10 11 12

		for (i = 0; i < (m - 1); i++) { // m-1 => ex) 5월이라고 했을 때 months는 4월까지지만 index번지를 생각했을 때 3번지까지이므로 m-1
			nalsu += months[i]; // nalsu = nalsu+months[i]
		}

		// y년m월1일까지의 날수
		nalsu += 1;

		// 입력한 y년m월1일이 무슨 요일인지 확인(나머지 : 0~6사이)
		week = nalsu % 7;

		// System.out.print(week);

		// 달력 출력
		// [2023년 11월]
		
			
		System.out.printf("%8s[ %d년 %d월 ]"," ",y,m); // 공백 = 문자 = %s
		System.out.println();
		
		
		System.out.println("\n  일  월  화  수  목  금  토"); // ln + \n =2줄 띔, 공백2칸+한글 2byte = 4byte
		System.out.println("------------------------------");

		// 앞에 수요일(1일)까지 빈공간 채우기
		for (i = 0; i < week; i++) {
			System.out.print("    "); // 공백 4칸 (4byte)
		}

		// index(번지) : 0 1 2 3 4 5 6 7 8 9 10 11
		// 배열        : 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
		// 월(months) : 1 2 3 4 5 6 7 8 9 10 11 12
		// 월의 날짜 출력
		for (i = 1; i <= months[m - 1]; i++) {
			System.out.printf("%4d", i); // %.2f - 소수점 아래 두자리까지 표시해라, %4d - 4자리 (4번째 자리에 찍힌다! <=숫자는 오른쪽 정렬 , 문자는 왼쪽 정렬)
			week++;

			if (week % 7 == 0) {
				System.out.println();
			}
		}

		if (week % 7 != 0) {
			System.out.println();
		}
		System.out.println("------------------------------");
	}
}


💡 **출력**
년도?2023
월?11
        [ 2023년 11월 ]

  일  월  화  수  목  금  토
------------------------------
               1   2   3   4
   5   6   7   8   9  10  11
  12  13  14  15  16  17  18
  19  20  21  22  23  24  25
  26  27  28  29  30
------------------------------


📌 Note Code



Test2-2. 입력한 년도,월,일에 따라 요일 출력하기

💻 입력

import java.util.Scanner;

public class Test3 {

	public static void main(String[] args) {

		//*요일구하기
		//(사용자한테) 년도? 
		//월?
		//일?
		//결과 : 2023년 11월20일 월요일

		
		
		// 만년 달력 만들기 (윤년은 4번에 한번씩- 2월29일)

		Scanner sc = new Scanner(System.in);

		// int months[] = new int[12]; // months 1월에는 31, 2월에는 28.29일~
		int months[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; // 배열을 만듦과 동시에 변수의 값에 바로 초기화하는 방법{,,,}
		int y, m, d, nalsu, i, week; // week[0~6 나머지]

		do {
			System.out.print("년도?");// 2023
			y = sc.nextInt();
		} while (y < 1); // 안돼요~ true의 반대인 false값이 나오게 적어야함.

	
		//년도 다음에 윤년인지 그다음 확인
		// y년이 윤년(인지 확인하는 공식 -> 2월 28일? or 29일?
		if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0) { // &&먼저 , y%400==0이면 윤년임 -> true면 윤년임
			months[1] = 29;
			// System.out.print("윤년이다");
		}
		
		
		
		do {
			System.out.print("월?");
			m = sc.nextInt();
		} while (m < 1 || m > 12);
		
		
		do {
			System.out.print("일?");
			d = sc.nextInt();
			
		} while (d < 1 || d >months[m-1]);// *** m-1 = index번호는 m-1
		


		// 전년도(y-1)년 12월 31일까지의 날수를 구하여라
		nalsu = (y - 1) * 365 + (y - 1) / 4 - (y - 1) / 100 + (y - 1) / 400;


		for (i = 0; i < (m - 1); i++) { 
			nalsu += months[i]; 
		}
		
		
		// y년m월1일까지의 날수 = nalsu +=1인데, 지금까지의 날수를 사용자가 정하게되면 nalsu+=d, nalsu = nalsu + d
		nalsu += d;

		// 입력한 y년m월1일이 무슨 요일인지 확인(나머지 : 0~6사이)
		week = nalsu % 7;

		String yoil[] = {"일","월","화","수","목","금","토"};
		//char yoil[] = {'일','월','화','수','목','금','토'};
		
		
		System.out.printf("%d년 %d월%d일 %s요일",y,m,d,yoil[week]); //-> yoil[week=숫자] -> 1번지 = 월요일

		
		
		//요일 출력
		//결과 : 2023년 11월20일 월요일ㄴ
		
		
		
	}
}

💡 **출력**
년도?2023
월?11
일?11
2023년 11월11일 토요일


📌 Note Code



Test3. 5개 숫자를 받아 오름차순으로 정렬하기

💻 입력

import java.util.Scanner;

public class Test4 {


	public static void main(String[] args) {
		//selection sort - 왼쪽 기준으로 계속 비교하는 것 (오름차순일때 가장 왼쪽이 낮은 수)
		//다중 for문 이용
		
		int[] num = {35,27,13,10,5};
		
		int i,j,temp;
		
		System.out.print("Source Data : ");
		for(i=0;i<num.length;i++) {
			System.out.printf("%4d",num[i]);
		}
		System.out.println();
		
		
		
		//정렬작업
		for(i=0;i<num.length-1;i++) { // ex) 배열[5]개수 - 1 = 4번 반복횟수
			
			for(j=i+1;j<num.length;j++) { //j = i+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) {
			System.out.printf("%4d",num[i]);
		}
		System.out.println();
		*/
		
		
		//배열같은 구조에서 쓸 수 있는 for문 = 확장 for문(microsoft의 for문)
		System.out.print("Sorted Data : ");
		for(int su : num) { //시작과 끝값이 몇개건 상관없이 맨 처음 값 su를 꺼내와서 계속 반복하다가 -> 나중에 없으면 for문 중지 [int su : num]
			System.out.printf("%4d",su);
		}
		System.out.println();

	}

}

💡 **출력**
Source Data :   35  27  13  10   5
Sorted Data :    5  10  13  27  35


📌 Note Code



Test4. 두 개의 수를 입력받아 적은 수에서 큰수까지의 합

💻 입력


import java.util.Scanner;

public class Test5 {

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);

		System.out.print("두개의 수 입력?");// 1 100
		int[] num = new int[2];
		int[] temp = { 0 };

		for (int i = 0; i < num.length; i++) {
			num[i] = sc.nextInt();
		}

		if (num[0] > num[1]) { // temp값을 이용하면 오른차순순으로 정렬됨 그래서 왼쪽이 
			temp[0] = num[0];
			num[0] = num[1];
			num[1] = temp[0];
		}
			int sum = 0;
			for (int i = num[0]; i <= num[1]; i++) {
				sum += i;
			}

			System.out.println(num[0] + "부터" + num[1] + "까지 총합 : " + sum);

	}
}

💡 **출력**
두개의 수 입력?7 10
7부터10까지 총합 : 34

0개의 댓글