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