배열 자세히 알아보기(선형 자료구조)

WOOK JONG KIM·2023년 3월 6일
0
post-thumbnail
post-custom-banner

많은 수의 데이터를 다룰때 사용하는 자료구조로, 각 데이터를 인덱스와 1:1 대응하도록 구성되어있음

데이터가 메모리 상에 연속적으로 저장되어있음
-> 이로 인해 인접한 메모리에 빠르게 엑세스 가능

데이터의 추가/삭제가 번거로운 편

  • 미리 최대 길이를 정해서 생성해야 함
  • (가득 찼을때) 데이터를 추가하거나 삭제할려면 새로운 배열(메모리)을 생성해야함(길이가 fix 되어있기떄문에)
  • 데이터 삭제 시, 인덱스를 유지하기 위해 빈 공간 유지
public static void main(String[] args){
        // ArrayList - 1차원, 2차원
        ArrayList list2 = new ArrayList(Arrays.asList(1,2,3));

        list2.add(4); list2.add(5); 
        list2.remove(2);
        list2.remove(Integer.valueOf(2)); // 2라는 값을 제거!
        System.out.println("list2 = " + list2);
        
        ArrayList list2d = new ArrayList();
        ArrayList list1d1 = new ArrayList(Arrays.asList(1,2,3));
        ArrayList list1d2 = new ArrayList(Arrays.asList(4,5,6));
        list2d.add(list1d1);
        list2d.add(list1d2);
        
}

배열 구현 예시

public class MyArray {

    int[] arr;

    // 배열의 초기 사이즈 설정
    MyArray(int size){
        this.arr = new int[size];
    }

    // 배열에 데이터 삽입
    public void insertData(int index, int data){
        if(index < 0 || index > this.arr.length-1){
            System.out.println("Index Error");
            return;
        }

        int[] arrDup = this.arr.clone();
        this.arr = new int[this.arr.length+1];

        for (int i = 0; i < index; i++) {
            this.arr[i] = arrDup[i];
        }

        for(int i = index + 1; i < this.arr.length; i++){
            this.arr[i] = arrDup[i-1];
        }

        this.arr[index] = data;
    }

    // 배열에서 특정 데이터 삭제
    public void removeData(int data){
        int targetIndex = -1;

        for(int i = 0; i < this.arr.length; i++){
            if(this.arr[i] == data){
                targetIndex = i;
                break;
            }
        }

        if(targetIndex == -1){
            System.out.println("해당 데이터가 없습니다.");
        }else {
            int[] arrDup = this.arr.clone();
            this.arr = new int[this.arr.length - 1];

            for (int i = 0; i < targetIndex; i++) {
                this.arr[i] = arrDup[i];
            }

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

연습문제

	// 피크 값을 출력하는 로직 구현(피크 : 양쪽의 값보다 큰 경우)
    public static void main(String[] args){
        int[] arr = {3,1,2,6,2,2,5,1,9,10,1,11};

        for(int i = 0; i<arr.length; i++){
            if(i == 0 && arr[i] > arr[i+1]){
                System.out.print(arr[i] + " ");
            }else if (i == arr.length - 1 && arr[i] >arr[i - 1]){
                System.out.print(arr[i] + " ");
            }else{
                if(arr[i] > arr[i - 1] && arr[i] > arr[i+1]){
                    System.out.print(arr[i] + " ");
                }
            }
        }
        System.out.println();
    }
    
    // 오름차순 구현
    public static void main(String[] args){
        int[] arr = {5, 3, 1, 4, 6, 1};
        int[] visited = new int[arr.length];
        int visitCnt = 0;
        int minVal = Integer.MAX_VALUE;
        int minIdx = -1;

        while(visitCnt < arr.length){
            for(int i = 0; i < arr.length; i++){
                if(arr[i] < minVal && visited[i] == 0){
                    minVal = arr[i];
                    minIdx = i;
                }
            }

            if(minIdx != -1){
                System.out.print(minVal + " ");
                visited[minIdx] = 1;
                visitCnt++;
            }

            minVal = Integer.MAX_VALUE;
            minIdx = -1;
        }
        System.out.println();
    }
public class Practice {

    // 중복 값을 제거한 새 배열 만들기

    public static void main(String[] args){
        int[] arr = {1,5,3,2,2,3,1,4,1,2,3,5};
        int[] arrResult = new int[arr.length];
        int cnt = 0;

        for (int i = 0; i < arr.length; i++) {
            boolean dupFlag = false;
            for(int j = 0; j < cnt; j++){
                if(arr[i] == arrResult[j]){
                    dupFlag = true;
                }
            }
            if(!dupFlag){
                arrResult[cnt++] = arr[i];
            }
        }
        for (int i = 0; i < cnt; i++) {
            System.out.print(arrResult[i] + " ");
        }
        System.out.println();
    }
}
public class Practice {

    // 2차원 배열 arr을 시계방향으로 90도 회전시킨 결과물 출력

    // 입출력 예시:
    // arr:                         result:
    // 1 2 3 4 5                    11 6 1
    // 6 7 8 9 10                   12 7 2
    // 11 12 13 14 15               13 8 3
    //                              14 9 4
    //                              15 10 5

    public static void main(String[] args){
        int[][] arr = {{1,2,3,4,5}, {6,7,8,9,10}, {11,12,13,14,15}};

        int[][] arr90 = new int[arr[0].length][arr.length];

        for(int i = 0; i < arr.length; i++){
            for(int j = 0; j < arr[i].length; j++){
                int r = arr.length - 1 - i;
                arr90[j][r] = arr[i][j];
            }
        }
    }
}

profile
Journey for Backend Developer
post-custom-banner

0개의 댓글