[Java] 배열

Walter Mitty·2022년 10월 20일
0

KOSTA

목록 보기
10/33
  • 배열: 동일 자료형의 데이터 묶음
    • 서로 다른 의미를 담고 있는게 아니라, 비슷한 의미를 담고있는 데이터를 배열로 묶어주는 것!
      갯수(몇개 몇개 몇개..), 주(1주, 2주, 3주...)

  • 배열변수 선언(생성) 방법
//'int 배열 타입의 month 변수' 라고 읽는다.
int[] month;
or
int month[];

//배열크기 선언
month = new int[12];
// 변수이름 = new 변수자료형[크기]

//index의 번호는 '크기의 -1' 까지만 쓸 수 있다.

//배열길이(index의 갯수)
int length = month.lengh;
//사실 바로 sout(month.length) 해도 된다.

범위를 벗어나면 ArrayIndexOutOfBoundsException 이 발생한다.
내가 생각한것보다 늘 배열 길이를 +1 하거나 -1 을 해서 그런다!

month[0] = 70; // index는 0부터 시작한다. month[0]~month[11]이 있다.
		System.out.println(month.length);
		System.out.println(month[0]); //70
		System.out.println(month[1]); //0
        //선언을 안했기 떄문에 [1]~[11]은 0으로 초기화되어있다.
        int index = 2;
        //변수값을 index의 숫자 대신으로 사용할 수 있다.
		System.out.println(month[index]);
  • 자바의 배열은 무조건 참조형이다.
    • 기본형: 메모리에 직접 값을 갖는 구조
    • 참조형: 다른 메모리를 참조한다. 기본형이 아닌 것들 모두 참조형.
    • 배열 선언 + 배열 생성 이라는 과정을 꼭 거쳐야한다.
int[] month = new int[12];
//에서 new란 새로운 메모리를 확보한다는 뜻이다.
// 그 다움 int[12]를 만나면 int 타입의 방 12개의 메모리를 새로 확보하라는 뜻이다.
// 값 안담아주면 0으로 초기화까지 같이한다.

배열선언시 고민할 것은,
월에 해당하는 걸음처럼 비슷한 유형의 데이터들을 배열로 처리를 하는 것이지 비슷하지 않은 데이터들을 배열로 처리하면 안된다.
예를들어, 1월의 걸음과 2월의 월급과 3월의 카드값을 하나의 배열로 만들 수 없다.

  • 배열초기화 : 배열 선언+생성+입력 한꺼번에
String[] sjt = {"Kor","Math","Eng"};
subject = {"Java","HTML","Spring"}; //이렇게 재초기화를 하려고하면,
//Array constants can only be used in initializers 에러가 난다.

//그래서 굳이 재초기화를 원하면, 아래처럼 해줘야한다.
subject = new String[]{"Java","HTML","Spring"};

참고자료 ➡️ Bubble/Selection Sort


상황:
1. 최댓값을 계산하시오
2. 최솟값을 계산하시오.
3. 선택정렬(selection sort)로 오름차순하시오.
4. 중앙값을 계산, 출력하시오.

  • 공통
int[] numArr2 = {10, 3, 5, 2, 6};
//TODO : 최댓값을 계산하시오
//TODO : 최솟값을 계산하시오.
//TODO : 선택정렬(selection sort)로 오름차순하시오.
//TODO : 중앙값을 계산, 출력하시오.

int max = numArr2[0]; //비교를 위해 제일 첫번째 인덱스를 넣어줌
int min = numArr2[0];
  1. 최대값
  2. 최소값 구하기.
//방법 1
for(int num : numArr2) {
	if(num > max) {
	    max = num;
	}
	if(num < min) {
	    min = num;
	}
}
System.out.println("최댓값은:" + max + " 최솟값은:" + min + " 입니다.");
	    
//방법 2
for(int i=0; i<=numArr2.length-1; i++) {
	if(numArr2[i] > max) {
	    max = numArr2[i];
	}
	if(numArr2[i] < min) {
		min = numArr2[i];
	}
}
System.out.println("최대값은:" + max + " 최소값은:" + min + " 입니다.");
  1. 오름차순 정렬 다시 풀어봐야함!
//방법 1: 강사님이 원한 방법 → 완전 실패 ^^;;;
for(int i=0; i<=numArr2.length-1; i++) {
	int min = numArr2[i];
	for(int j=i; j<numArr2.length-1; j++) {
	    if(numArr2[j] < min) {
		    min = numArr2[j];
		}
	}
	numArr2[i] = min;
	System.out.println("오름차순은 " + numArr2[i] + "입니다.");
}

//방법 2: 내가 푼 방법
Arrays.sort(numArr2);

for(int num : numArr2) {
	System.out.print(num + " ");
}
System.out.println();

방법 1 출력값
2
2
2
2
6

방법 2 출력값
2 3 5 6 10

  1. 중앙값
int center = numArr2[(numArr2.length/2)];
System.out.println("중앙값은 " + center + "입니다.");
	    

Arr[0] = [0]~[4]최소값
Arr[1] = Arr[1]~[4] 중 가장 작은 값
Arr[2] = Arr[2]~[4] 중 가장 작은 값..


  • 로또 번호 혼자 다시 사고해보기
    • Math.random( ) 함수
      • double type 이므로 (int)로 형변환 해줘야한다.
      • 구하려는 숫자 N를 곱하고 전체에 + 1을 해줘야한다.
        왜냐하면 1~45까지라했을 때 1.0< <45.0가 되므로! 1< <46.0까지 의 숫자를 받는 것이 된다.
        예) 5까지의 랜덤 정수 숫자
        (int)(Math.random( )*5)+1

1~45사이의 중복되지 않는 로또 숫자 6개를 만드시오.

int length = lotto.length;
for(int i=0; i<=length-1; i++) {
	//45까지의 정수면, Math.random()*45) + 1 해줘야한다.
	lotto[i] = (int)(Math.random() * 45) + 1;
	    	
	// 중복 번호 제거
	for(int j=0; j<i; j++) { // 중복된 번호가 있으면 이전 포문으로 돌아가 다시 시행한다.
		if(lotto[i] == lotto[j]) {
        //현재 뽑은 숫자가 이전 인덱스에 같은게 있는지 돌아야하므로 j<i 가 된다.
			i--;
			break; // 브레이크 안하면 Math.random 또 하고, 중복된 숫자가 또 나올수도 있다. 
            //따라서 브레이크로 빠져 나오면 가장 근접한 반복문 밖으로 빠져나가게됨. 
		}
     } //여기로 빠져나옴 -> 바깥쪽 반복문의 증감식 , 즉 i++로 간다.
     System.out.print(lotto[i] + " "); //로또 번호 출력
}	

오늘 숙제

int[] numArr = {1, 5, 3, 2, 1, 5, 2, 7, 8, 3, 5, 6, 10, 5};
int[] cntArr = new int[10]; //각 숫자의 출현횟수가 누적될 배열. cntArr[0]은 1의 출현횟수가 누적될 배

//1의 출현횟수 : 2회
//2의 출현횟수 : 2
//3 : 2
//4 : 0
//5 : 4

//나의 풀이
int j;
		
for(int i=0; i<=9; i++) {
	for(j=0; j<numArr.length-1; j++) {
		if(numArr[j] == i+1) {
			cntArr[i] += 1;
		}
	}
	System.out.println(cntArr[i]);
}
// 이중 for문 사용으로 N² 만큼의 시간복잡도가 나와서 Runtime이 두배 이상이 걸린다....
  • Better Solution
//강사님이 알려주신 방법 	
for(int i=0; i<=9; i++) {
	for(int i = 0; i <= numArr.length-1; i++) {
		cntArr[numArr[i]-1] += 1;
	}
    System.out.println(cntArr[i]);
}
// 시간복잡도 N 만큼의 Runtime 소요

1개의 댓글

comment-user-thumbnail
2022년 10월 20일

저도 보고 공부할게요! 감사합니다~~
@)))))) 김밥 많이 드려야겠어요! 속이 비지않게!

답글 달기