프로그래밍/자바(java) 융합개발자 2차

[자바 3일차] 22일차 - 배열, 난수

aSpring 2021. 1. 14. 12:47
728x90
728x90

2021/01/13 - [공부/자바(java) 융합개발자 2차] - [자바 기초] 21일차 - 반복문(for, while, do ~ while)

2021/01/12 - [공부/자바(java) 융합개발자 2차] - [자바 기초] 20일차 일지 - Eclipse에서 Hello 출력, 변수, if문

 

com.day03 패키지 생성

Exam01.java 지난 시간 복습 - 아래와 같이 출력되도록 하기

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

package com.day03;

public class Exam01 {

	public static void main(String[] args) { 
		
		for(int i = 9; i > 0; i -= 2) { 
			for(int j = i; j >0; j--) { 
				System.out.print("*"); 
			}
			System.out.println("");
		}
        System.out.println("========================");
		for(int i = 9; i > 0; i -= 2) { 
			for(int j = 1; j <= i; j++) {
				System.out.print("*");  
			}
			System.out.println();
		}
		System.out.println("========================");
		for(char i = 'I'; i>='A'; i--) {
			for(char j='A'; j<=i; j++) {
				System.out.print(j);
			}
			System.out.println();
		}
	}
}

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

======================== 
*********
*******
*****
***
*
========================
ABCDEFGHI
ABCDEFGH
ABCDEFG
ABCDEF
ABCDE
ABCD
ABC
AB
A

 

Exam02 몇 개 입력받을지 물어보고, 그 수만큼 숫자를 입력하여, 그 수들의 합계를 출력

내 답

package com.day03;

import java.util.Scanner;

public class Exam02 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		System.out.println("숫자를 몇개 입력하시겠습니까?");
		int no = sc.nextInt();
		int sum=0;
		System.out.println("숫자를" + no + "개 입력하세요");
		
		for(int i=1; i <= no; i++) {
			int no1 = sc.nextInt();
			sum = sum + no1;
		}
		System.out.println("숫자 " + no + "개의 합 : " + sum);
	}
}

숫자를 몇개 입력하시겠습니까?
2
숫자를2개 입력하세요
20 30 
숫자 2개의 합 : 50

 

package com.day03;

import java.util.Scanner;

public class Exam02 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("숫자를 몇개 입력하시겠습니까?");
		int no = sc.nextInt();
		
		int sum=0;
		System.out.println("숫자를" + no + "개 입력하세요");
		
		for(int i=0; i < no; i++) {
			int no1 = sc.nextInt();
			sum += no1;
		}
		System.out.println("숫자 " + no + "개의 합 : " + sum);
	}
}

숫자를 몇개 입력하시겠습니까?
8
숫자를8개 입력하세요
10 30 50 4 8 6 5 1
숫자 8개의 합 : 114

 

그 수의 합계를 출력한 뒤 입력해준 수도 출력하고 싶다면?

for문 밖에서 System.out.print(num1+"\t"); 을 해주면 마지막에 입력된 값만 출력이 됨

-> 이 때 배열이 필요함

배열 : 같은 자료형을 갖는 구조

 

Exam03. int형 5개를 가지는 배열

int[] arr = new int[5];

arr은 int형의 배열이구나.

이 배열은 5개의 int를 가지는 배열 arr 이구나.

 

package com.day03;

public class Exam03 {

	public static void main(String[] args) {
		int[] arr = new int[5];
		System.out.println("arr:"+arr);
	}
}

arr:[I@3ac3fd8b

 

배열은 주소값을 가진다.

arr:[I@3ac3fd8b -> 컴퓨터 메모리에 주어진 주소값

 

배열은 0부터 시작하고 int의 초기값은 0

package com.day03;

public class Exam03 {

	public static void main(String[] args) {
		int[] arr = new int[5];
		System.out.println("arr:"+arr);
		
		for(int i=0; i < 5; i++) {
			System.out.println(arr[i]); // arr[0] arr[1] arr[2] arr[3] arr[4]
		}
	}
}

0
0
0
0
0

 

package com.day03;

public class Exam03 {

	public static void main(String[] args) {
		int[] arr = new int[5];
		arr[3] = 100;
		
		for(int i=0; i < 5; i++) {
			System.out.println(arr[i]); // arr[0] arr[1] arr[2] arr[3] arr[4]
		}
	}
}

0
0
0
100
0

 

package com.day03;

public class Exam03 {

	public static void main(String[] args) {
		int[] arr = new int[5];
		arr[3] = 100;
		
		for(int i=0; i < 5; i++) {
			System.out.println(arr[i]); // arr[0] arr[1] arr[2] arr[3] arr[4]
		}
		arr[5] = 200;
	}
}

오류 남 -> arr은 0~4까지 5개 이므로

 

배열의 길이를 바꾸면 for문의 i < 배열길이 도 계속 바꿔줘야 함

이 때 arr.length를 이용하면 알아서 배열의 길이가 적용됨

package com.day03;

public class Exam03 {

	public static void main(String[] args) {
		int[] arr = new int[10];
		arr[3] = 100;
		
		for(int i=0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
	}
}

배열.ltength 를 해주면 내가 배열을 5로 만들던 10으로 만들던 수정할 필요 없이 알아서 배열 길이만큼으로 적용이 된다.

0
0
0
100
0
0
0
0
0
0

 

크기가 5인 배열 tmp 를 만들고 tmp의 값은 1 2 3 4 5 로 한 뒤 출력하라

package com.day03;

public class Exam03 {

	public static void main(String[] args) {

		int[] tmp = new int[5];
		tmp[0] = 1;
		tmp[1] = 2;
		tmp[2] = 3;
		tmp[3] = 4;
		tmp[4] = 5;
		
		for(int i=0; i < tmp.length; i++) {
			System.out.println(tmp[i]);
		}
	}
}

1
2
3
4
5

 

조금 더 세련되게 표현해보자

package com.day03;

public class Exam03 {

	public static void main(String[] args) {

		int[] tmp = new int[5];
		
		for(int i=0; i < tmp.length; i++) {
			tmp[i] = i+1;
		}
		
		for(int i=0; i < tmp.length; i++) {
			System.out.println(tmp[i]);
		}
	}
}

또는

package com.day03;

public class Exam03 {

	public static void main(String[] args) {

		int[] tmp = new int[5];

		for(int i=0; i < tmp.length; i++) {
			tmp[i] = i+1;
			System.out.println(tmp[i]);
		}
	}
}

1
2
3
4
5

 

값을 100 200 300을 가지는 배열 크기가 3인 str 생성

int[] str = new int[3];
str[0] = 100;
str[1] = 200;
str[2] = 300;

이것을

int[] str = {100, 200, 300};

배열의 초기값을 알고 있다면 이렇게 간단하게 표현할 수 있음

그러나 이 str은 크기가 3으로 고정이되어 str[0] str[1] str[2]까지만 되고 str[3]에 어떤 값이라도 추가할 수 없음

처음 만든 크기로 고정이 됨

 

문자열 배열 생성

package com.day03;

public class Exam03 {

	public static void main(String[] args) {

		String[] st = {"Hello", "Java", "Hi"};
		for(int i=0; i < st.length; i++) {
			System.out.println(st[i]);
		}
	}
}

Hello
Java
Hi

 

Exam02로 돌아가서 입력한 갯수만큼 수를 입력받아 그 수들의 합을 구한 뒤, 입력해준 값 출력하기

package com.day03;

import java.util.Scanner;

public class Exam02 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("숫자를 몇개 입력하시겠습니까?");
		int no = sc.nextInt();
		int sum=0;
		
		int[] tmp = new int[no];
		System.out.println("숫자를" + no + "개 입력하세요");
		
		for(int i=0; i < no; i++) {
			tmp[i] = sc.nextInt();
			sum += tmp[i];
		}
		System.out.println("숫자 " + no + "개의 합 : " + sum);
		
		for(int i=0; i < tmp.length; i++) {
			System.out.println("입력 값 : " + tmp[i]);
		}
		
	}
}

숫자를 몇개 입력하시겠습니까?
3
숫자를3개 입력하세요
10 20 30
숫자 3개의 합 : 60
입력 값 : 10
입력 값 : 20
입력 값 : 30

 

위의 입력 값 중 최대값을 출력하고 싶다.

package com.day03;

import java.util.Scanner;

public class Exam02 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("숫자를 몇개 입력하시겠습니까?");
		int no = sc.nextInt();
		int sum=0;
		
		int[] tmp = new int[no];
		System.out.println("숫자를" + no + "개 입력하세요");
		
		for(int i=0; i < no; i++) {
			tmp[i] = sc.nextInt();
			sum += tmp[i];
            if(tmp[i] > max) {
            max = tmp[i];
		}
		System.out.println("숫자 " + no + "개의 합 : " + sum);
		
		for(int i=0; i < tmp.length; i++) {
			System.out.println(tmp[i]);
		}
		//입력값 중에서 최대 값을 출력하시오.
        System.out.println("최대 값은 : " + max);
	}
}

숫자를 몇개 입력하시겠습니까?
3
숫자를3개 입력하세요
100 5 50
숫자 3개의 합 : 155
100
5
50
최대 값은 : 100 .

 

Exam04 int형의 배열 data를 만들고 10, 5, 100, 200, 30, 77을 할달하고 최대값, 배열 합계, 평균을 출력하라.

package com.day03;

public class Exam04 {

	public static void main(String[] args) {
		int[] data = {10, 5, 100, 200, 30, 77};
		int max = 0;
		int sum = 0;
		float avg = 0;
		
		for(int i = 0; i < data.length; i++) {
        	sum += data[i]; 
            
			if(data[i] > max) {
				max = data[i];
			}

		}
        
		avg = sum/data.length;
		
		System.out.println("최대값 : " + max);
		System.out.println("배열 합계 : " + sum);
		System.out.println("배열 평균 : " + avg);
	}
}

최대값 : 200
배열 합계 : 422
배열 평균 : 70.0

package com.day03;

public class Exam04 {

	public static void main(String[] args) {
		int[] data = {10, 5, 100, 200, 30, 77};
		int max = 0;
		int sum = 0;

		for(int i = 0; i < data.length; i++) {
        	sum += data[i]; 
            
			if(data[i] > max) {
				max = data[i];
			}
		}
		System.out.println("최대값 : " + max);
		System.out.println("배열 합계 : " + sum);
		System.out.println("배열 평균 : " + sum/data.length);
	}
}

최대값이 몇 번째에 있는지 위치를 알고싶다.

package com.day03;

public class Exam04 {

	public static void main(String[] args) {
		int[] data = {10, 5, 100, 200, 30, 77};
		int max = 0;
		int sum = 0;
		int maxPos = 0;
		
		for(int i = 0; i < data.length; i++) {
			sum += data[i]; 
			if(data[i] > max) {
				max = data[i];
				maxPos = i+1;
			}
			
		}
		
		System.out.println("최대값 : " + max);
		System.out.println("최대값의 위치 : " + maxPos);
		System.out.println("배열 합계 : " + sum);
		System.out.println("배열 평균 : " + (float)sum/data.length);
	}
}

 

최대값 : 200
최대값의 위치 : 4
배열 합계 : 422
배열 평균 : 70.333336

 

배열에서 수 찾기

 

선생님 답

package com.day03;

import java.util.Scanner;

public class Exam04 {

	public static void main(String[] args) {
		int[] data = {10, 5, 100, 200, 30, 77};
		int max = 0;
		int sum = 0;
		int maxPos = 0;
		
		for(int i = 0; i < data.length; i++) {
			sum += data[i]; 
			if(data[i] > max) {
				max = data[i];
				maxPos = i+1;
			}
			
		}
		
		System.out.println("최대값 : " + max);
		System.out.println("최대값의 위치 : " + maxPos);
		System.out.println("배열 합계 : " + sum);
		System.out.println("배열 평균 : " + (float)sum/data.length);
		
		System.out.println("찾는 수를 입력해주세요");
		Scanner sc = new Scanner(System.in);
		int search = sc.nextInt();
        boolean flag = false;
        
		for(int i = 0; i < data.length; i++)
		{
			if(search==data[i]) {
            System.out.println("배열에 있습니다.");
            flag = true;
            break;
            }
		}
        if(flag== false) {
        System.out.println("없습니다");
        }
	}
}

 

최대값 : 200
최대값의 위치 : 4
배열 합계 : 422
배열 평균 : 70.333336
찾는 수를 입력해주세요
54
없습니다.

 

최대값 : 200
최대값의 위치 : 4
배열 합계 : 422
배열 평균 : 70.333336
찾는 수를 입력해주세요
77
있습니다.

 

난수 Math.random() : 컴퓨터가 발생시켜주는 수

0~1 사이의 double형 난수 발생

package com.day03;

import java.util.Scanner;

public class Exam04 {

	public static void main(String[] args) {
		System.out.println(Math.random());
	}
}

0.1630248549583463

 

0~10 사이의 난수 발생

package com.day03;

import java.util.Scanner;

public class Exam04 {

	public static void main(String[] args) {
		System.out.println(Math.random()*10);
	}
}

2.9155579149803525

 

-> 정수형으로 강제 변환 시켜주기

(int)(Math.random()*10);

package com.day03;

import java.util.Scanner;

public class Exam04 {

	public static void main(String[] args) {
		int r = (int)(Math.random()*10);
		System.out.println(r);
	}
}

9

 

Exam05. 크기가 10인 배열을 만들고, 0~50 사이 난수를 발생해서 배열에 넣기

단, 0이 아닌 값을 넣기

배열에 값(중복) 허용

package com.day03;

public class Exam05 {

	public static void main(String[] args) {
		
		int[] arr = new int[10];
		
		for(int i=0; i < arr.length; i++) 
		{
			int r = (int)(Math.random()*50);
			if(r != 0) {
			arr[i] = r;
			System.out.println("arr[" + i + "] : " + arr[i]);
			}
		}
	}
}

arr[0] : 31
arr[1] : 46
arr[2] : 22
arr[3] : 30
arr[4] : 44
arr[5] : 16
arr[6] : 21
arr[7] : 36
arr[9] : 27 

 

처럼 정수형으로 강제 전환한 난수가 0인 경우(여기서는 i가 8일 때 난수가 0이어서) arr[8]은 제외하고 출력되는 문제 발생

 

난수가 0일 경우 또 다른 난수를 생성해 출력하는 방법이 필요함

내 답

package com.day03;

public class Exam05 {

	public static void main(String[] args) {
		
		int[] arr = new int[10];
		
		for(int i=0; i < arr.length; i++) 
		{
			int r = (int)(Math.random()*50);
			arr[i] = (r != 0) ? r : (int)(Math.random()*50);
			System.out.println("arr[" + i + "] : " + arr[i]);
		}
	}
}

arr[0] : 36
arr[1] : 39
arr[2] : 22
arr[3] : 28
arr[4] : 43
arr[5] : 42
arr[6] : 12
arr[7] : 43
arr[8] : 8
arr[9] : 49

-> 이건 틀렸을 듯!!

 

선생님 답

난수를 몇 번 발생시킬것인지 모른다. 왜? 난수가 0이 발생할 경우 0이 아닐때까지 또 돌려야 하므로

-> while : 몇 번 돌릴지 모른다.

package com.day03;

public class Exam05 {

	public static void main(String[] args) {
		int[] arr = new int[10];
		
		int n = 0; // 배열에 넣은 수
		while(n<arr.length) {
			int r = (int)(Math.random()*50); // 여기서 발생한 난수가 0이 아닐 때 arr[n]에 r 집어넣음
			if(r==0) continue; // 난수 r이 0이면 다시 난수 발생시키러 올라감 
			arr[n] = r;
			n++;
		}
		for(int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
	}
}

 

 

더 간단하게 표현해보기

package com.day03;

public class Exam05 {

	public static void main(String[] args) {
		int[] arr = new int[10];
		
		int n = 0; // 배열에 넣은 수
		while(n<arr.length) {
			int r = (int)(Math.random()*50); // 여기서 발생한 난수가 0이 아닐 때 arr[n]에 r 집어넣음
			if(r==0) continue; // 난수 r이 0이면 다시 난수 발생시키러 올라감 
			arr[n] = r;
			n++;
		}

		for(int num : arr) {
			System.out.print(num + "\t");
		}
		


	}
}

28 25 23 31 16 28 2 2 46 10

 

for(int num : lotto) {
  System.out.print(num);
}

위, 아래가 같은 말!

for(int num = 0; num < lotto.length; num++) {
   System.out.print(lotto[num]);
}

for each문 참고

https://wikidocs.net/264

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

 

 

 

로또 번호 추첨기 만들기(중복된 값X, 1~45사이의 숫자 6개 발생시킬 것)

package com.day03;

public class Exam06 {

	public static void main(String[] args) {
		int[] lotto = new int[6];
		int n = 0; // 배열에 들어간 로또 번호의 갯수
		
		do  {
        	boolean flag =false;
			int r = (int)(Math.random()*45)+1; // 0~44가 나오므로 +1해주기
			//중복이면 배열에 못 들어가도록 break;
			for(int i = 0; i < n; i++) {
				if(r==lotto[i]) {
                flag=true;
                break;
				}
			}
            if(flag == true) continue;
            
			lotto[n] = r;//난수를 배열에 저장
			n++; // 배열에 로또번호 들어갔으니 1 증가
			
		} while(n<lotto.length);
		//로또 번호 6개 출력하기
		for(int num : lotto) {
			System.out.print(num + "\t");
		}
	}
}

이 방법은 중복이면 아예 안 넣는 방법

 

Exam07 다른 방법으로 바꿔보기 do while 말고 while 사용

package com.day03;

public class Exam07 {

	public static void main(String[] args) {
		int[] lotto = new int[6];
		int n = 0; // 배열에 들어간 로또 번호의 갯수
		
		while(n<lotto.length) {
			
			int r = (int)(Math.random()*45)+1; // 난수 발생, 0~44가 나오므로 +1해주기
			lotto[n] = r;//난수를 배열에 저장
			
			for(int i = 0; i < n; i++) { //중복확인
				if(r==lotto[i]) { // 중복이면 아래 실행
				n--; //앞에 중복된 난수를 n--해서 새로운 난수로 대체될 수 있게함
                break;
				}
			}          
			n++; // 배열에 로또번호 들어갔으니 1 증가
		}
		//로또 번호 6개 출력하기
		for(int num : lotto) {
			System.out.print(num + "\t");
		}
	}
}

 

728x90
728x90