본문 바로가기

java/배열(Array)

문제 풀이

 

  1. 빈 배열의 예외 처리
    • 배열이 비어 있는 경우(null)를 체크하는 조건문은 반드시 실행 코드보다 위에 작성해야 한다.
    • 예를 들어: 
    • if (arr == null || arr.length == 0) { System.out.println("배열이 비어 있습니다."); }
  2. 레퍼런스 타입과 원시 타입
    • 원시 타입(Primitive Type): int, boolean, char 등은 실제 값을 저장.
    • 레퍼런스 타입(Reference Type): String, 배열, 클래스 등은 값이 아닌 메모리 주소를 저장.
      • 예: String str = "java";는 문자열 "java"의 주소를 저장.
    • 초기화 시 기본값:
      • String: null
      • Boolean: false
      • 배열: 선언하면 null, 생성하면 해당 타입의 기본값.
  3. 배열의 특징
    • 배열에는 한 가지 타입의 값만 저장 가능.
    • 배열의 크기는 고정. 요소 추가 시 새 배열을 생성해야 함.
    • 배열.length는 크기를 나타내며, 메서드가 아니라 값이라 소괄호 ()를 붙이지 않음.
  4. 깊은 복사(Deep Copy)와 얕은 복사(Shallow Copy)
    • 깊은 복사: 배열의 을 복사하여 새로운 메모리 공간에 저장.
    • 얕은 복사: 배열의 주소값만 복사하여 동일한 메모리를 참조.
  5. 문자열과 배열
    • 문자열은 수정 불가능(Immutable):
      • 문자열 수정 시 새로운 문자열 객체를 생성.
      • 예:
        String str = "java";
        str = str + "spring"; // 새로운 객체 생성
        
    • 배열은 수정 가능:
      • 배열의 요소는 직접 접근하여 수정 가능.
  6. 문자열 비교
    • 문자열을 비교할 때는 반드시 equals() 메서드 사용.

코드 분석

1. 배열 맨 앞에 요소 추가

  • System.arraycopy()로 해결:
    public int[] addToFront(int[] arr, int el) {
        int[] arr2 = new int[arr.length + 1];
        System.arraycopy(arr, 0, arr2, 1, arr.length); // 기존 배열을 새 배열로 복사
        arr2[0] = el; // 첫 번째 요소에 새로운 값을 삽입
        return arr2;
    }
    
  • for 문으로 해결:
    public int[] addToFront(int[] arr, int el) {
        int[] arr2 = new int[arr.length + 1];
        for (int i = 0; i < arr.length; i++) {
            arr2[i + 1] = arr[i]; // 기존 배열의 값을 한 칸씩 뒤로 밀어 복사
        }
        arr2[0] = el; // 첫 번째 요소에 새로운 값을 삽입
        return arr2;
    }
    

2. 두 배열 합치기

  • 코드에서 막힌 부분:
for (int i = arr1.length; i < arr3.length; i++) {
arr3[i] = arr2[i]; // 여기서 인덱스 문제 발생 
}
  • 문제는 arr2의 인덱스arr3의 시작점이 어긋나는 것이다.
    • arr2[i]에서 i는 arr3의 인덱스로 사용되고 있으므로, arr2의 인덱스를 다시 계산해야 한다.
  • 수정된 코드:
public int[] mergeArrays(int[] arr1, int[] arr2) {
    int[] arr3 = new int[arr1.length + arr2.length];
    
    for (int i = 0; i < arr1.length; i++) {
        arr3[i] = arr1[i]; // arr1 복사
    }
    for (int i = 0; i < arr2.length; i++) {
        arr3[arr1.length + i] = arr2[i]; // arr2를 arr3의 뒤쪽에 복사
    }
    return arr3;
}

추가 개념: 피보나치 수열

피보나치 수열은 다음과 같은 규칙으로 생성된다:

  1. 첫 번째와 두 번째 값은 각각 0과 1.
  2. 이후의 값은 이전 두 값을 더한 값.
  • 예제 코드:
    public int[] fibonacci(int n) {
        int[] fib = new int[n];
        fib[0] = 0;
        if (n > 1) {
            fib[1] = 1;
        }
        for (int i = 2; i < n; i++) {
            fib[i] = fib[i - 1] + fib[i - 2];
        }
        return fib;
    }
    
  • 출력 예시:
    • 입력: n = 6
    • 출력: [0, 1, 1, 2, 3, 5]

 

'java > 배열(Array)' 카테고리의 다른 글

배열 탐색  (0) 2024.04.08
2차원 배열  (0) 2024.04.08
1차원 배열  (0) 2024.04.08
배열이란  (0) 2024.04.08