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(); }
블로그의 정보
개발자 미니민의 개발로그
mini_min