국비 6일차_1

강지수·2023년 12월 19일
0

국비교육

목록 보기
11/97

지난 시간 복습

Ctrl+Shift+O : 필요한 import 설정 단축키


지난 미션

강사님의 코드 1

반복문 없이 일단 구조 만들기

		int scores[]=new int[5];
		Scanner sc=new Scanner(System.in);
		
		System.out.println("1번 점수 입력");
		int a=sc.nextInt();
		System.out.println("2번 점수 입력");
		int b=sc.nextInt();
		System.out.println("3번 점수 입력");
		int c=sc.nextInt();
		System.out.println("4번 점수 입력");
		int d=sc.nextInt();
		System.out.println("5번 점수 입력");
		int e=sc.nextInt();
		
		int sum=a+b+c+d+e;
		float avg=0.0f;
		
		avg=(float)sum/scores.length;
		System.out.println("인원:"+scores.length);
		System.out.println("총점:"+sum);
		System.out.println("평균:"+avg);

결과


강사님의 코드 2

반복문과 배열을 사용해 구조 정리하기

		int scores[]=new int[5];
		Scanner sc=new Scanner(System.in);
		
		int sum=0;

		for (int i=0;i<scores.length;i++) {
			System.out.println((i+1)+"번 점수 입력");
			scores[i]=sc.nextInt();
			sum+=scores[i];
		}
		
		float avg=0.0f;
		avg=(float)sum/scores.length;
		
		System.out.println("인원:"+scores.length);
		System.out.println("총점:"+sum);
		System.out.println("평균:"+avg);

결과


점수에 제한을 줘보자 (0~100)

강사님의 코드

//		점수의 제한 : 0~100
		
		int scores[]=new int[5];
		Scanner sc=new Scanner(System.in);
		
		int sum=0;

		for (int i=0;i<scores.length;i++) {
			System.out.println((i+1)+"번 점수 입력");
			scores[i]=sc.nextInt();
//			검사 0~100
			if (!(scores[i]>=0 && scores[i]<=100)) {
//				정상구간 (0이상 100이하) 가 아닐 때 처리
				i--;
			}
			sum+=scores[i];
		}
		
		float avg=0.0f;
		avg=(float)sum/scores.length;
		
		System.out.println("인원:"+scores.length);
		System.out.println("총점:"+sum);
		System.out.println("평균:"+avg);

첫 번째 입력에서 구간을 넘어가게 되면 오류가 발생함.


디버깅

break point 가 필요함
-> line 번호 앞에서 더블클릭
ex)

또는 line 번호 우클릭 - Toggle Breakpoint

후 F11 - Confirm Perspective Switch - Switch

debug 모드로 바꾸겠느냐? 라는 뜻

위와 같이 창이 바뀌는데, F11로 디버깅 시작 후 F5를 눌러 동작 순서대로 진행이 어떻게 되는지 볼 수 있다.

F5 를 계속 누르면 순서대로 진행이 된다.

디버깅 모드를 나갈 때는 좌측 상단 빨간 네모 (Terminate) 버튼을 눌러 디버깅 모드를 끄고, 우측 Debug 창을 닫으면 된다.


다시 위의 문제로 돌아와서

for (int i=0;i<scores.length;i++) {
			System.out.println((i+1)+"번 점수 입력");
			scores[i]=sc.nextInt();
//			검사 0~100
			if (!(scores[i]>=0 && scores[i]<=100)) {
//				정상구간 (0이상 100이하) 가 아닐 때 처리
				i--;
			}
			sum+=scores[i];
		}

에서 ① 처음 i 값이 0 으로 주어지고, ② 출력, ③ 입력값을 배열의 0번째에 넣기, ④ 검사, ⑤ 정상구간이 아닐경우, ⑥ i--, ⑦ i값이 -1이 된다, ⑧ sum 연산을 한다, ⑨ i++ 순으로 진행이 되는데, 여기서 ⑦ i값이 -1이 된다 문제가 되기 때문에 오류가 발생함.
그 이유는 밑의 'sum+=scores[i]' 에서 배열 번호가 -1이 될 수 없기 때문에 오류가 발생한다.

해법

		for (int i=0;i<scores.length;i++) {
			System.out.println((i+1)+"번 점수 입력");
			scores[i]=sc.nextInt();
//			검사 0~100
			if (!(scores[i]>=0 && scores[i]<=100)) {
//				정상구간 (0이상 100이하) 가 아닐 때 처리
				i--;
				continue;
			}
			sum+=scores[i];
		}

i--; 다음에 continue; 를 주어 sum 으로 넘어가지 않고 for문으로 넘어가게 만들면 오류 없이 해결이 된다.


for문 무한루프

//		for문 무한루프
		for (;;) {
			System.out.println("hi");
		}

결과

무한 hihihiihihihhihiihi가 반복된다
계속 놔두면 프로그램이 다운되기 때문에 terminate를 통해 종료시켜준다.

while 문과 동일한 역할.


for문을 활용해서 * 찍기

		for (int i=0;i<5;i++) {
			for (int j=0;j<5;j++) {
				System.out.print("*");
			}
			System.out.println();
		}

결과

*****
*****
*****
*****
*****

		for (int i=0;i<5;i++) {
			for(int j=0;j<i;j++) {
				System.out.print("*");
			}
			System.out.println();
		}

결과

*
**
***
****

		for (int i=0;i<5;i++) {
			for(int j=4;j>i;j--) {
				System.out.print("*");
			}
			System.out.println();
		}

결과

****
***
**
*

강사님의 코드

		for (int i=5;i>0;i--) {
			for(int j=0;j<i;j++) {
				System.out.print("*");
			}
			System.out.println();
		}

결과

*****
****
***
**
*

		for (int i=0;i<5;i++) {
			for(int j=4;j>i;j--) {
				System.out.print(" ");
			}
			for(int j=0;j<i;j++) {
				System.out.print("*");
			}
			System.out.println();
		}

결과

    
   *
  **
 ***
****

		for (int i=0;i<5;i++) {
			for (int j=0;j<5;j++) {
				if (j<(4-i)) {
					System.out.print(" ");
				} else {
					System.out.print("*");
				}
			}
			System.out.println();
		}

결과

    *
   **
  ***
 ****
*****

삼항 연산자

형식 : (Type) (변수이름) = (조건식)? (참일 때의 결과값):(거짓일 때의 결과값);

		int a;
		a=(10<5)?10:20;
		System.out.println(a);
		a=(10>5)?10:20;
		System.out.println(a);

결과

20
10

위의 조건식은 거짓이기 때문에 20 이라는 결과가, 아래의 조건식은 참이기 때문에 10 이라는 결과가 나온다.

		String b;
		b=(1>5)?"맞다":"틀리다";
		System.out.println(b);

결과

틀리다

b는 결과값이 문자열이기 때문에 string 을 사용


강사님의 코드

		for (int i=0;i<5;i++) {
			for (int j=0;j<5;j++) {
				System.out.print(j<(4-i)?" ":"*");
			}
			System.out.println();
		}

결과

    *
   **
  ***
 ****
*****

삼항연산자를 써도 if문과 같은 결과가 나온다. 삼항 연산자를 이용하면 더 간결한 코드를 쓸 수 있다.


윤년

Leap Year : 윤년

서력 기원 연수가 4로 나누어 떨어지는 해는 윤년으로 한다. (1988년, 1992년, 1996년, 2004년, 2008년, 2012년, 2016년, 2020년, 2024년, 2028년, 2032년, 2036년, 2040년, 2044년 ...)
서력 기원 연수가 4, 100으로 나누어 떨어지는 해는 평년으로 한다. (1700년, 1800년, 1900년, 2100년, 2200년, 2300년...)
서력 기원 연수가 4, 100, 400으로 나누어 떨어지는 해는 윤년으로 둔다. (1600년, 2000년, 2400년...)

위의 3가지 조건을 다 만족해야 윤년을 구분할 수 있다.

스캐너로 연도를 입력받아 평년인지 윤년인지 구분해서 출력하세요.
		Scanner scanner=new Scanner(System.in);
		System.out.println("연도를 입력하세요:");
		int year=scanner.nextInt();
		
		if (year%4==0) {
			if (year%100==0) {
				if (year%400==0) {
					System.out.println("윤년입니다.");
				} else {
					
				} System.out.println("평년입니다.");
			} else {
				
			} System.out.println("윤년입니다.");
		} else {
			System.out.println("평년입니다.");
		}

결과

연도를 입력하세요:
2000
윤년입니다.
평년입니다.
윤년입니다.

뭔가가 틀림.
많이 틀림.

강사님의 코드

		Scanner s=new Scanner(System.in);
		System.out.println("연도를 입력하세요:");
		int yearNum=s.nextInt();
		System.out.println("연도 : "+yearNum);
		
//		판정
		
		if(yearNum%400==0) {
			System.out.println("윤년1");
		} else if(yearNum%100==0) {
			System.out.println("평년1");
		} else if(yearNum%4==0) {
			System.out.println("윤년2");
		}  else {
			System.out.println("평년2");
		}

결과

연도를 입력하세요:
1988
연도 : 1988
윤년2

어떤 조건을 먼저 거르고 그다음 조건을 넣을 것인지, 크기 비교를 잘 해서 순서에 맞게 넣어야 함


반복 진행 + 프로그램 종료 기능

//		leap year : 윤년
//		스캐너로 연도를 입력받아 평년인지 윤년인지 구분해서 출력하세요.
		
//		년도 입력 - 판단 - 년도 계속입력 - '-1' 입력 시 프로그램 종료
		
		Scanner s=new Scanner(System.in);
		
		while (true) {
			System.out.println("연도를 입력하세요:");
			int yearNum=s.nextInt();
			System.out.println("연도 : "+yearNum);
			
			
//		판정
			if(yearNum==-1) {
				System.out.println("프로그램 종료");
				break;
			} else if(yearNum%400==0) {
				System.out.println("윤년1");
			} else if(yearNum%100==0) {
				System.out.println("평년1");
			} else if(yearNum%4==0) {
				System.out.println("윤년2");
			} else {
				System.out.println("평년2");
			}
		}

결과


반복적인 출력문 압축하기

		Scanner s=new Scanner(System.in);
		String str="";
		
		while (true) {
			System.out.println("연도를 입력하세요:");
			int yearNum=s.nextInt();
			System.out.println("연도 : "+yearNum);
			
			
//		판정
			if(yearNum==-1) {
				System.out.println("프로그램 종료");
				break;
			} else if(yearNum%400==0) {
				str="윤년1";
			} else if(yearNum%100==0) {
				str="평년1";
			} else if(yearNum%4==0) {
				str="윤년2";
			} else {
				str="평년2";
			}
			System.out.println(str);
		}

결과


정렬 알고리즘

정렬의 알고리즘은 비슷한데, 어떤 데이터 타입이냐에 따라 효율적인 방법의 차이가 존재한다.

정렬을 진행할 때, 배열에 담긴 data 끼리의 맞교환은 불가능.

따라서 임시 공간 (변수) 을 사용해야한다.
ex) 1에 있는 a 와 2 에 있는 b 를 바꾸려면 3 이라는 임시 공간을 만들어서

[1] a -> [3]
=>[1] : 없음, [2] : b, [3] : a
[2] b -> [1]
=> [1] b, [2] : 없음, [3] : a
[3] a -> [2]
=> [1] b, [2] a, [3] : 없음

버블 정렬

//		버블 정렬
		int[] arr= {20,10,5,4,2};
		
		int tmp;
		for(int i=0;i<arr.length;i++) {
			for (int j=0;j<arr.length-1;j++) {
				if (arr[j]>arr[j+1]) { // 오름차순
					tmp=arr[j];
					arr[j]=arr[j+1];
					arr[j+1]=tmp;
				}
			}
		}
		System.out.println(Arrays.toString(arr));

결과

[2, 4, 5, 10, 20]

Arrays.toString() : 배열의 data를 list 형태로 출력해주는 함수


com.tech.gt002 package 생성

로또 만들기

//		로또 만들기
//		배열 size : 6, 배열 이름 : arr
//		1 ~ 45 까지의 숫자 중 random으로 6개 저장해서 출력하세요.
		
		Random ran=new Random();
		
		int arr[]=new int [6];
		int tmp;
		
		for(int i=0;i<arr.length;i++) {
			int ranNum=ran.nextInt(45)+1;
			arr[i]=ranNum;
		}
		
		for(int i=0;i<arr.length;i++) {
			for (int j=0;j<arr.length-1;j++) {
				if (arr[j]>arr[j+1]) {
					tmp=arr[j];
					arr[j]=arr[j+1];
					arr[j+1]=tmp;
				}
			}
		}
		
		System.out.println("당첨 번호 : "+Arrays.toString(arr));

결과

당첨 번호 : [4, 4, 10, 14, 21, 36]

오류 발생 : 로또의 규칙상 중복번호가 있으면 안됨.


강사님의 코드

//		강사님의 코드
		int[] arr=new int[6];
		Random r=new Random();
		
		for (int i = 0; i < arr.length; i++) {
			int rNum=r.nextInt(45)+1; // 1~45
			arr[i]=rNum;
		}
		System.out.println(Arrays.toString(arr));

결과

[12, 45, 3, 45, 31, 1]

마찬가지로 중복번호 발생, 중복 예외처리 해야 함.


//		강사님의 코드
		int[] arr=new int[6];
		Random r=new Random();
		int cnt=0;
		
		for (int i = 0; i < arr.length; i++) {
			cnt++;
			int rNum=r.nextInt(45)+1; // 1~45
			arr[i]=rNum;
//			중복 검사 처리
			for (int j=0;j<i;j++) {
				if(arr[j]==rNum) {
					i--;
					break;
				}
			}
		}
		System.out.println(Arrays.toString(arr));
		System.out.println("cnt:"+cnt);

결과

[45, 19, 26, 29, 32, 33]
cnt:7

중복 검사 처리 코드를 추가해서 중복번호는 예외처리를 한다.
cnt 처럼 임의의 변수를 추가해서 for문이 몇번 도는지 확인하면 중복을 예외처리했는지 확인해볼 수 있다.


if문으로 중복처리

설명해주시다 오류 발생 및 시간부족으로 넘어감


Min / Max

Min

		int min=100;
		int[] arr= {80,40,70,20,30};
		for (int i=0;i<arr.length;i++) {
			if(min>arr[i]) {
				min=arr[i];
            }
		}
		System.out.println("min:"+min);

결과

min:20

min의 초기값은 배열의 값들보다 큰 수를 넣어야 한다.
max의 경우는 0과 같이 작은 수를 넣으면 된다.

profile
개발자 준비의 준비준비중..

0개의 댓글