개발자 미니민의 개발스터디

11. Array 배열 + 퀴즈

by mini_min

◾ 배열 선언 : int[] num;

메모리 할당 : num = new int[5]; (5개를 저장할 수 있는 정수형 배열 메모리가 할당되다)

배열 선언과 동시에 메모리 할당도 가능하다. int [] num = new int[5];

 

◾ 정수형 배열은 초기화 하지 않아도, 메모리가 할당될 때 0으로 자동 초기화가 이루어진다.

System.out.println("num[0] :" + num[0]);

 

◾ 배열 요소 접근은 [] 안에 숫자를 써서 접근한다.

0부터 요소수 -1 까지 접근 가능하다.

5개의 메모리를 저장하는 배열은, 0 부터 4까지 배열 요소에 접근할 수 있다.

 

◾ length 필드로 요소수를 알 수 있다.

num[0] = 1; num[1] = 3; num[2] = 5; num[3] = 7; num[4] = 9;

//첨자가 "요소수-1"를 벗어 나면 런타임 오류 발생
// num[5] = 11;
// 배열 요소의 수 : length 필드로 요소수를 알 수 있다.
System.out.println("배열개수 : " + num.length);

 

◾ 향상된 for 문

for (자료형 변수 : 배열명) {

  배열명 어쩌구 ... 

}

int[] score = new int[5];
score[0] = 100; score[1] = 90; score[2] = 80; score[3] = 90; score[4] = 90;   

int tot = 0, ave;
for(int n : score) {

    //System.out.println(n);
    tot +=n;

}

 

◾ 배열은 크기를 변경할 수 없다.

배열의 크기를 변경하면 이전 배열은 garbage collector 의 대상이 된다.

 

◾ 배열 2개가 있을 때, int[] b = a; 

배열 b 가 a의 값이 아니라 a의 주소값을 b가 접근한다는 말이다.

즉, 값이 아니라 a의 주소값을 참조한다는 말이다. 하나의 배열을 공유한다는 말!!

 

a 배열을 b 도 공유하면서 b 배열의 값이 변경되어서 a 배열의 값도 변경되었다. (10 20 30 -> 15 120 30)

int[]a = new int[3];
a[0] = 10; a[1] = 20; a[2] = 30; // 10 20 30

int[]b = a;			//a의 값이 아니라 a의 주소값을 a도 접근하고 b도 접근한다는 소리다. a=100번지 b=100번지
                    // 위에 값을 대입한 것과 주소값(참조값)을 참조하는 것은 다르다. 하나의 배열을 공유하는 것.  
b[0] += 5;
b[1] += 100;

System.out.println("a 배열...");
for(int n : a) {
    System.out.print(n+ "  ");	// 15 120 30 
}
System.out.println();


System.out.println("\nb 배열...");
for(int n : b) {
    System.out.print(n+ "  ");	// 15 120 30
}
System.out.println();

 

◾ 1~100 까지 수중 서로 다른 난수 10개 발생

난수 발생은 (int)(math.random() * 100) + 1 해준다.

같은 값이 난수가 10개 메모리 배열에 들어가지 않도록 , for 문에서 직전 값과 비교해서 같은 값이면 회차(i) 값을 빼고 다시 for 문이 돌아가도록 break 를 걸어준다.

int[]n = new int[10];
for(int i=0; i<10; i++) {
    n[i] = (int)(Math.random()*100) +1;		//배열에 값 넣기 (10번 반복)

    for(int j=0; j<i; j++) {	// 서로 다른 난수값 주기 = 이전값들과 비교해서 같은 값이 있으면 -1(다시 실행) 해준다. 
        if(n[i] == n[j]) {
            i--;		// 이전 실행으로 돌아가는 것과 같은 뜻이다.
            break;
        }
    }
    //브레이크가 들어오는 부분!!
}

 

◾ 1에서 10까지의 난수를 100개 발생하여 한줄에 10개씩 출력

마지막에 1부터 10까지 숫자가 몇 번 발생했는지 횟수를 출력한다.

int[] count = new int[10];
int n;

for(int i=0; i<100; i++) {
    n = (int)(Math.random()*10) +1;	//1~10까지 난수 발생해 n이됨. 
                //만약 9=n / count[9-1=8]8번방 값이 ++1된다. 
    count[n-1]++; 						// n=2면 count[1]의 갯수에 +1 
    System.out.printf("%3d", n);

    if((i+1)%10==0) {
        System.out.println();	
    }
}

System.out.println("\n숫자별 발생 횟수 : ");
for(int i=0; i<count.length; i++) {
    System.out.println((i+1) + " : " + count[i]);
}

 

◾ 배열 초기화 : 초기화 하는 경우, 초기값의 개수가 배열 요소의 수가 된다.

초기화하는 경우 new int[]를 new int[5] 처럼 요소수를 지정할 수 없다. 

new int[] 생략 가능

int []a = {2, 4, 6, 8, 10};

int []b;
// b = {1, 3, 5, 7} <= 컴파일오류
b = new int[] {1, 3, 5, 7};

 

◾ 💥 요일구하기 

1년 1월 1일은 월요일이다.

1년 1월 1일 ~ 2023년 2월 24일 까지 전체 날수와 월별 days 배열을 가지고 요일을 구한다.

💥 이때, 윤년 신경써야한다. 윤년인 경우 월별 days 배열에서 2월 날짜 변경해줘야한다.

(year%4==0 && year%100!=0 || year%400==0 ? 29: 28)

Scanner sc = new Scanner(System.in);

          // 0    1   2   3   4   5   6   7   8   9   10  11
int []days = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
String[] week = new String[] {"일", "월", "화", "수", "목", "금", "토"};

int year, month, day;
int tot, w;

do {
    System.out.println("년도 ? ");
    year = sc.nextInt();
}while(year < 1);

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

//2월의 마지막 날짜 계산
//윤년 신경쓰기 
days[1] = year%4==0 && year%100!=0 || year%400==0 ? 29: 28;

do {
    System.out.println("일 ? ");
    day = sc.nextInt();
}while(day < 1 || day > days[month-1]);

 

1년 1월 1일 ~ 입력한 year - 1년 12월 31일까지 날수 구하기

tot = (year-1)*365 + (year-1)/4 - (year-1)/100 + (year-1)/400;

 

year 년 month - 1일 까지의 날수 더하기!

for(int i=0; i<month-1; i++) {
    tot += days[i];
}

 

나머지 day 로 요일 배열에서 해당되는 순서 구하기 

tot+= day;

w = tot%7;

System.out.println(year + "년 " + month + "월 " + day + "일은 " + week[w] + "요일 입니다.");

 

◾ 배열 정렬 sort() 

배열 sort 로 오름차순 정렬이 가능하다.

Arrays.sort(num);

 

◾ Arrays의 sort()를 이용하여 int[] 는 내림차순 정렬을 할 수 없고 integer로 변환해서 정렬한다. 

Integer[] aa = Arrays.stream(num).boxed().toArray(Integer[]::new);
Arrays.sort(aa, Comparator.reverseOrder());

 

◾ 년도 입력 받아 년도의 띠 구하기

원숭이 띠 부터 시작된다.

Scanner sc = new Scanner(System.in);
int n;
String [] animal = { "원숭이", "닭", "개", "돼지", "쥐", "소", "범", "토끼", "용", "뱀", "말", "양"};

System.out.print("년도 ? ");
n = sc.nextInt();


System.out.println(n + "년도는 " + animal[n%12] + "의 해입니다.");

 

◾ 로또 자동 구매하기 

구매 개수가 1~5가 아닌 경우 다시 입력 받기 (do while 조건으로 제어하기)

1~45 난 수 중에서 서로 다른 6개 수 맞추기

중복값은 나올 수 없으니 이중 for 문으로 제어하기 

 

1번 for 문 : 구매 개수만큼 

2번 for 문 : 6개의 난수 발생

3번 for 문 : 중복 값의 난수라면 이전 회차로 돌아가기 (break)

Scanner sc = new Scanner(System.in);
int count;
int[] num = new int[6];

do {
    System.out.print("구매개수[1~5] ? ");
    count =sc.nextInt();
}while(count <1 || count>5);

for(int i=0; i<count; i++) {
    for(int j=0; j<num.length; j++) {
        num[j] = (int)(Math.random()*45) +1;

        for(int k=0; k<j;k++) {
            if(num[k] == num[j]) {
                j--;		// 이전 실행으로 돌아가는 것과 같은 뜻이다.
                break;
            }
        }

    }


    Arrays.sort(num); // 정렬			////////////////////////////

    System.out.print((i+1)+"번째 : ");
    for(int n : num) {
        System.out.printf("%5d", n);	
    }
    System.out.println();
}

 

 

 

'개발 공부중 > 📑 코드 복습' 카테고리의 다른 글

13. Array 정렬 (버블,삽입,선택 정렬)  (0) 2023.02.24
12. Array 2차원 배열 + 퀴즈  (0) 2023.02.24
10. while 문  (0) 2023.02.24
* 연산 퀴즈  (0) 2023.02.23
9. for 문  (0) 2023.02.22

블로그의 정보

개발자 미니민의 개발로그

mini_min

활동하기