
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);
}
}
여기서 주목할 점 몇 가지를 살펴보자.
// 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);
}
}
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())를 쓰면 값 (여기서는 정수 값)을 기준으로 값을 제거할 수 있다는 점을 참고하자.
이전의 출력 방법을 응용하여 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);
}
}
}
양 옆의 값보다 큰 수를 찾는 방법이다. 양끝 값을 별도로 처리해준 것을 참고하자.
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]);
}
}
}
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();
}
}
}