240116

이슬비·2024년 2월 1일

Java

목록 보기
2/3

배열

  • 같은 종류의 데이터를 저장하기 위한 자료구조이다.
  • 크기가 고정되어 있으며, 한 번 생성된 배열은 크기를 바꿀 수 없다.
  • 길이 변경이 필요하다면 새로운 배열을 생성한 후 원소를 옮긴다.
  • 배열은 객체(참조형)이며, 배열 변수에는 배열 객체의 주소값이 저장된다.
  • 배열의 원소를 참조하기 위해서는 배열 이름과 색인(index)를 조합하여 사용한다
  • 배열이름.length를 통해 배열의 길이를 조회할 수 있다.

배열의 선언

자료형[] 변수 또는 자료형 변수[]

자료형배열이름선언
intiArrint[] iArr;
charcArrchar[] cArr;
booleanbArrboolean[] bArr;
StringstrArrString[] strArr;
DatedateArrDate[] dateArr;

배열의 생성과 초기화

  1. 배열을 다음과 같이 생성할 때, 자료형의 기본값으로 초기화가 된다.
    자료형[] 배열이름 = new 자료형[길이];

  2. 배열의 길이를 설정하지 않고, 배열을 생성 및 값을 초기화하는 방법은 다음과 같다. 1의 방법처럼 길이와 함께 값을 초기화 하는 것은 불가능하다.
    자료형[] 배열이름 = new 자료형[] {값1, 값2, 값3, 값4};

  3. 좀 더 생략하여 다음과 같이 배열을 선언과 동시에 초기화할 수 있다. 다만 선언과 동시에 할 때만 가능하며, 선언을 이미 한 뒤 나중에 할당하는 것은 불가능하다.
    자료형[] 배열이름 = {값1, 값2, 값3, 값4};

String과 같은 참조형 변수의 경우 기본값으로 null이 사용된다.

배열의 순회

for

반복문을 이용하여 배열의 원소를 순회할 수 있다. 배열이름.length을 이용한다.

int[] intArray = {1, 3, 5, 7, 9};

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

for-each

가독성이 개선된 반복문으로, 배열 및 Collections에서 사용이 가능하다. 인덱스 대신 직접 원소에 접근하는 변수를 제공한다.

int[] intArray = {1, 3, 5, 7, 9};

for (int x: intArray) {
	System.out.println(x);
}

배열의 출력

반복문을 통해서 출력할 수도 있지만, Arrarys.toString(배열)을 통해 출력할 수 있다.

int[] intArray = {1, 3, 5, 7, 9};

System.out.println(Arrays.toString(intArray));  // [1, 3, 5, 7, 9]

그냥 intArray를 출력하면 원소가 아닌 참조값이 출력된다.

배열의 복사

배열은 생성하면 길이를 변경할 수 없기 때문에, 더 많은 저장공간이 필요하다면 큰 배열을 생성하고 이전 배열의 값을 복사 해야한다.

  1. 반복문을 통해 배열의 원소를 복사한다.

    int[] nums = {13, 56, 1, 99, 85};
    
    int[] tmp = new int[nums.length * 2];
    for (int i=0; i<nums.length; i++) {
        tmp[i] = nums[i];
    }
    System.out.println(Arrays.toString(tmp));  // [13, 56, 1, 99, 85, 0, 0, 0, 0, 0]
  2. 새로운 배열 = Arrays.copyOf(원본 배열, 새로운 배열의 크기)

    int[] nums = {13, 56, 1, 99, 85};
    
    int[] tmp = Arrays.copyOf(nums, 10)
    System.out.println(Arrays.toString(tmp));  // [13, 56, 1, 99, 85, 0, 0, 0, 0, 0]
  3. System.arraycopy(원본 배열, 원본 배열의 시작점, 복사 배열, 복사 배열의 시작점, 복사할 크기)

    int[] nums = {13, 56, 1, 99, 85};
    
    int[] tmp = new int[10];
    System.arraycopy(nums, 0, tmp, 0, nums.length);
    System.out.println(Arrays.toString(tmp));  // [13, 56, 1, 99, 85, 0, 0, 0, 0, 0]

배열의 응용

최댓값과 최솟값 찾기

for 문을 활용한다.

int min = Integer.MAX_VALUE;  // int형 중에서 제일 큰 값
int max = Integer.MIN_VALUE;  // int형 중에서 제일 작은 값
for (int i=0; i<nums.length; i++) {
	if (nums[i] > max) {
    	max = nums[i];
	}
    if (nums[i] < min) {
    	min = nums[i];
	}
}

System.out.printf("min: %d, max: %d%n", min, max);

for-each 문을 활용한다.

int min = Integer.MAX_VALUE;  // int형 중에서 제일 큰 값
int max = Integer.MIN_VALUE;  // int형 중에서 제일 작은 값
for (int num: intArray) {
	if (num > max) {
    	max = num;
	}
    if (num < min) {
    	min = num;
	}
}

System.out.printf("min: %d, max: %d%n", min, max);

또는 함수를 활용한다.

int min = Integer.MAX_VALUE;  // int형 중에서 제일 큰 값
int max = Integer.MIN_VALUE;  // int형 중에서 제일 작은 값
for (int i=0; i < nums.length; i++) {
	min = Math.min(min, nums[i]);
    max = Math.max(max, nums[i]);
}

System.out.printf("min: %d, max: %d%n", min, max);

초기 최댓값 또는 최솟값을 설정하는 방법으로는 MIN_VALUEMAX_VALUE를 활용하거나, 배열의 가장 첫번째 원소를 활용한다.

구간합 계산하기

주어진 배열에서 두 수 N, M이 주어질 때 N번 인덱스부터 M번 인덱스까지의 합을 구한다.

int sum = 0;
for (int i=N; i<=M; i++) {
	sum += arr[i];
}

System.out.println(sum);

또는 누적합을 모두 구하여 뺄셈 연산을 통해 구할 수도 있다.

for (int i=1; i<=M; i++) {
	arr[i] += arr[i - 1];
}

int tmp = 0;
if (N != 0) {
	tmp = arr[N - 1];
}

System.out.println(arr[M] - tmp);

빈도수 구하기

int [] count = new int[10];  // 수의 범위는 1부터 9까지

for (int i=0; i<arr.length; i++) {
	count[arr[i]]++;
}

System.out.println(Arrays.toString(count));

중앙값 찾기

크기 순으로 정렬하였을 때 가장 중앙에 위치하는 값을 말한다. 카운팅 정렬을 이용한다.

int [] count = new int[10];

for (int i=0; i<arr.length; i++) {
	count[arr[i]]++;
}

int sum = 0;
int median = 0;
for (int i=1; i<=9; i++) {
	sum += count[i];
    if (sum >= (arr.length + 1) / 2) {
    	median = i;
    	break;
	}
}

0개의 댓글