Array 정리

jhkim·2023년 12월 21일

자료구조

목록 보기
5/7

Array란?

개념 정리

Array는 우리가 직관적으로 알고 있는 표 / 테이블과 유사하다. 여기서는 조금 더 언어를 명확히 하여 자료구조의 의미를 써보겠다. Array란 각 데이터와 인덱스가 1:1로 대응하는 구조를 의미한다. 그래서, 데이터와 함께 '인덱스'라는 것이 반드시 존재한다.

이는 추후 설명할 Linked List와 비교하면 그 차이가 더 두드러진다. Array는 인덱스가 있어 값의 위치를 바로 확인할 수 있는 반면, Linked List는 인덱스가 없어 값을 탐색하려면, Head부터 쭉 찾아봐야한다는 단점이 있다. 아까 위에서 "각 데이터와 인덱스가 1:1로 대응하는 구조"라고 한 말이 바로 이 뜻이다. 결국 데이터에 맞는 인덱스가 있기 때문에 '탐색'이 쉽다고 이해하면 좋을 것이다.

그러면 반대로 인덱스를 써서 안 좋은 점도 있을 것이다. 인덱스를 쓰게 되면 데이터를 추가/삭제할 떄 인덱스를 다시 할당해야하는 문제점이 생긴다. 예를 들어 보자. {1,2,3,4,5}이라는 배열이 있다고 하자. 이 경우 '2'라는 데이터를 삭제하면, 남은 3,4,5의 인덱스 값을 모두 바꿔줘야 하는 문제가 생긴다. (물론 배열의 size도 변경해야 한다.) 그렇기 때문에, 추가/삭제가 빈번한 경우 다른 자료구조를 쓰는 것이 적절할 것이다.

주요 기능

주요 기능은 단순하게 add, remove만 확인해보고, 아래에서 이를 다양하게 활용하는 방법에 대해 알아보자.

import java.util.ArrayList;
import java.util.Arrays;

public class myArrayStudy {
    public static void main(String[] args){
        // Basics
        System.out.println("== 1차원 배열 ==");
        int[] arr = {1,2,3,4,5};
        for (int item : arr){
            System.out.println("item = " + item);
        }

        System.out.println("== 2차원 배열 ==");
        int[][] arr2 = {{1,2,3},{4,5,6}};
        System.out.println(arr2[0][1]);
        
        for (int[] row: arr2){
            for (int item: row){
                System.out.println("item = " + item);
            }
        }

        // ArrayList
        System.out.println("== Array List 활용 ==");
        ArrayList list1 = new ArrayList(Arrays.asList(1,2,3));
        System.out.println("list1 = " + list1);
        list1.add(4);
        list1.add(5);
        System.out.println("list1 = " + list1);
        list1.remove(2);
        System.out.println("list1 = " + list1);
        list1.remove(Integer.valueOf(2));
        System.out.println("list1 = " + list1);

        System.out.println("== Array List 2D ==");
        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);
        System.out.println("list2d = " + list2d);
        
    }
}

여기서 주목할 점 몇 가지를 살펴보자.

  • Array 출력방법
    Array를 출력할 때는 for문을 돌려서 가져오자.
        // Basics
        System.out.println("== 1차원 배열 ==");
        int[] arr = {1,2,3,4,5};
        for (int item : arr){
            System.out.println("item = " + item);
        }

        System.out.println("== 2차원 배열 ==");
        int[][] arr2 = {{1,2,3},{4,5,6}};
        System.out.println(arr2[0][1]);
        
        for (int[] row: arr2){
            for (int item: row){
                System.out.println("item = " + item);
            }
        }
  • ArrayList 활용
        System.out.println("== Array List 활용 ==");
        ArrayList list1 = new ArrayList(Arrays.asList(1,2,3));
        System.out.println("list1 = " + list1);
        list1.add(4);
        list1.add(5);
        System.out.println("list1 = " + list1);
        list1.remove(2);
        System.out.println("list1 = " + list1);
        list1.remove(Integer.valueOf(2));
        System.out.println("list1 = " + list1);

자바의 ArrayList()를 활용하여 다양한 기능을 사용하며, 이때 값을 넣기 위해서 Arrays.asList()를 사용하는 것을 참고하자. 또한, 값을 제거하고 싶을 때 reemove()를 쓰면 인덱스 기준으로, remove(Integer.valueOf())를 쓰면 값 (여기서는 정수 값)을 기준으로 값을 제거할 수 있다는 점을 참고하자.

어디서 사용하는가?

예제1. 값 찾기

이전의 출력 방법을 응용하여 for문 기반의 값을 찾을 수 있다. 이때 int[]로도 구현하여 풀이하는 것이 주목하자.

public class arrayPracticeQuestions {
    public static void main (String[] args){
        int[] arr2 = {1,1,100,1,1,1,100};
        int target = 100;
        int idx = -1;
        for (int i = 0; i < arr2.length; i++){
            if (arr2[i] == target){
                idx = i;
            }
        }
        if (idx == -1){
            System.out.println("No target here.");
        } else {
            System.out.println("idx = " + idx);
        }
    }
}

예제2. Peek 찾기

양 옆의 값보다 큰 수를 찾는 방법이다. 양끝 값을 별도로 처리해준 것을 참고하자.

 public class arrayPracticeQuestions {
    public static void main (String[] args){
 		int[] arr4 = {3,1,2,6,2,2,5,1,9,10,1,11};

        if (arr4[1] < arr4[0]){
            System.out.println(arr4[0]);
        }
        
        for (int i = 1; i < arr4.length-1; i ++)
            if (arr4[i] > arr4[i-1] & arr4[i] > arr4[i+1]){
                System.out.println(arr4[i]);
            }

        if (arr4[arr4.length-2] < arr4[arr4.length-1]){
            System.out.println(arr4[arr4.length-1]);
        }
    }
}

예제3. 출력 90도 뒤집기

2차원 배열에서 arr[0].length을 사용하면 행의 길이가, arr.length를 사용하면 열의 길이가 나온다는 점에 주목하자. 그 이후 newArr[i][cnt1] = row[i];를 통해 값을 정리해주면 된다.

 public class arrayPracticeQuestions {
    public static void main (String[] args){
        int[][] arr7 = {{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}};
        int[][] newArr = new int[arr7[0].length][arr7.length];
        int cnt1 = arr7.length-1;

        for (int[] row: arr7){
            int rowLength = row.length;
            for (int i = 0; i < rowLength; i++){
                newArr[i][cnt1] = row[i];
            }
            cnt1 --;
        }
        
        for (int[] row: newArr){
            for (int item: row){
                System.out.print(item + " ");
            }
            System.out.println();
        }
	}
}
profile
다시 시작합니다 :)

0개의 댓글