본 시리즈는 프로그래밍 자료구조의 개념을 정리하고 실습을 진행해보는 시리즈입니다.
ArrayList
는 배열이 꽉 찼을 때 크기가 1.5배로 확장되며, Python의 List
는 2배로 확장됩니다.ArrayList
는 내부적으로 배열을 사용하며, 배열이 가득 차면 더 큰 배열로 데이터를 복사하여 확장합니다.ArrayList
는 초기 크기를 지정할 수도 있으며, 크기가 초과되면 1.5배로 확장됩니다. import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(10); // 끝에 추가 (O(1))
numbers.add(20);
numbers.add(30);
numbers.add(1, 15); // 중간 삽입 (O(n))
System.out.println(numbers); // [10, 15, 20, 30]
numbers.remove(2); // 중간 삭제 (O(n))
System.out.println(numbers); // [10, 15, 30]
}
}
List
도 동적 배열처럼 작동하며, 메모리 크기가 부족할 경우 자동으로 확장됩니다.numbers = [10, 20, 30]
numbers.insert(1, 15) # 중간 삽입 (O(n))
print(numbers) # [10, 15, 20, 30]
numbers.pop(2) # 중간 삭제 (O(n))
print(numbers) # [10, 15, 30]
O(1)
이지만, 중간에 삽입하는 경우 O(n)
이 소요됩니다.O(1)
, 중간 삽입은 O(n)
의 시간 복잡도를 가집니다.O(n)
의 시간이 걸리며, 삭제 후 데이터를 이동해야 합니다.pop()
메서드를 사용하면 끝에서 삭제할 때 O(1)
, 중간에서 삭제할 때 O(n)
이 소요됩니다.O(1)
의 시간 복잡도를 가집니다.연산 | Java ArrayList | Python List | 시간 복잡도 설명 |
---|---|---|---|
삽입 (Insertion) | 끝에 삽입: O(1) 중간 삽입: O(n) | 끝에 삽입: O(1) 중간 삽입: O(n) | 끝에 삽입 시 배열 크기가 충분할 때는 O(1) 중간 삽입은 데이터 이동이 필요하여 O(n) |
삭제 (Deletion) | 중간 삭제: O(n) 끝에서 삭제: O(1) | 중간 삭제: O(n) 끝에서 삭제: O(1) | 중간 삭제 시 데이터 이동 필요 O(n) 끝에서 삭제는 즉시 가능하여 O(1) |
조회 (Access) | O(1) | O(1) | 인덱스를 통한 접근은 즉시 가능하여 O(1) |
ArrayList
는 JVM의 Garbage Collector가 불필요한 객체를 자동으로 메모리에서 제거해 주기 때문에, 메모리 관리는 자동으로 처리되지만 크기가 고정된 배열을 사용하기 때문에 중간 크기 조절 작업에서 비용이 발생할 수 있습니다.List
는 다양한 데이터 타입을 허용하기 때문에 잘못된 타입이 포함될 가능성이 있습니다. 문제: 주어진 리스트에서 중복을 제거하고, 정렬된 리스트를 반환하라.
HashSet
은 중복을 제거하는 데 O(1)
시간 복잡도를 가집니다. 이후 ArrayList
로 변환하여 정렬합니다.set
을 사용하여 중복을 제거한 후 list
로 변환해 정렬합니다. 마찬가지로 O(1)
시간 복잡도로 중복 제거가 가능합니다.Set에 관한 사항은 추후에 다른 포스팅에서 정리할 예정입니다.
Java
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.Collections;
public class Main {
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<>();
numbers.add(10);
numbers.add(20);
numbers.add(10);
numbers.add(30);
numbers.add(20);
Set<Integer> uniqueNumbers = new HashSet<>(numbers); // O(1) 시간 복잡도로 중복 제거
List<Integer> sortedList = new ArrayList<>(uniqueNumbers);
Collections.sort(uniqueNumbers); // 중복 제거 후 정렬
System.out.println(uniqueNumbers); // [10, 20, 30]
}
}
Python
numbers = [10, 20, 10, 30, 20]
unique_numbers = list(set(numbers)) # O(1) 시간 복잡도로 중복 제거
unique_numbers.sort()
print(unique_numbers) # [10, 20, 30]
ArrayList
와 Python의 List
는 모두 동적 배열 기반 자료구조로서, 크기 조절이 자유롭다는 공통점이 있습니다.ArrayList
에서 JVM의 Garbage Collector가 자동으로 메모리를 관리하며, Python은 가비지 컬렉터를 통해 동적으로 메모리 할당과 해제를 처리합니다.LinkedList
자료구조를 살펴보고, 배열과 어떻게 다른지 비교할 예정입니다.