
본 시리즈는 프로그래밍 자료구조의 개념을 정리하고 실습을 진행해보는 시리즈입니다.
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 자료구조를 살펴보고, 배열과 어떻게 다른지 비교할 예정입니다.