새발블로그

리스트 본문

Problem Solving/개념

리스트

EUG 2025. 7. 4. 17:27

리스트란?

  • 순서가 있는 데이터 집합
  • 중복 허용
  • 인덱스로 접근 가능
  • 수정 및 삭제 가능 (mutable)

정적 배열 (Static Array)

고정된 크기를 갖는 배열. 선언 시 메모리를 미리 할당받으며, 크기 변경이 불가능

특징

  • 고정 크기
    예: int arr[5] = {1, 2, 3, 4, 5};
  • 연속된 메모리에 저장됨 → 빠른 접근(O(1)) 가능
  • 데이터 삽입/삭제에 비효율적

예시 (C/C++)

int arr[5] = {3, 7, 4, 2, 6};  // 5개의 int형 배열
  • arr[3] 접근 → arr + (3 * 4byte)로 산술 연산만으로 접근 가능

동적 배열 (Dynamic Array)

실행 중 크기를 유연하게 변경할 수 있는 배열. 배열이 가득 차면 더 큰 배열로 복사 후 교체

특징

  • 데이터 추가 시 용량 초과되면 2배로 확장 (Doubling)
  • 대부분의 삽입 연산은 O(1), 리사이징 발생 시 O(n)
  • Amortized O(1) 삽입 시간복잡도

Java에서의 배열 및 리스트

정적 배열 사용

int[] arr = new int[5];            // 선언
arr[0] = 1;                        // 수정
System.out.println(arr[0]);       // 접근
int[] copy = Arrays.copyOf(arr, arr.length); // 복사

2차원 배열 복사 (Deep Copy)

int[][] copy = new int[original.length][];
for (int i = 0; i < original.length; i++) {
    copy[i] = Arrays.copyOf(original[i], original[i].length);
}

 

Java의 동적 배열: ArrayList

선언과 초기화

List<Integer> list = new ArrayList<>();
List<Integer> list2 = new ArrayList<>(List.of(1, 2, 3));

주요 연산

연산 예시 시간복잡도
추가 (끝에) list.add(10); O(1)
추가 (중간에) list.add(2, 10); O(n)
삭제 (끝에) list.remove(list.size() - 1); O(1)
삭제 (중간에) list.remove(2); O(n)
접근 / 수정 list.get(i);, list.set(i, v); O(1)

값 삭제 vs 인덱스 삭제 주의

list.remove(2);                  // 2번째 인덱스 삭제
list.remove(Integer.valueOf(2)); // 값이 2인 요소 삭제

 

2차원 ArrayList

List<List<Integer>> matrix = new ArrayList<>();
for (int i = 0; i < 3; i++) {
    List<Integer> row = new ArrayList<>();
    for (int j = 0; j < 3; j++) {
        row.add(i * 3 + j);
    }
    matrix.add(row);
}

2차원 ArrayList Deep Copy

List<List<Integer>> deepCopy = new ArrayList<>();
for (List<Integer> row : matrix) {
    deepCopy.add(new ArrayList<>(row));
}

 

리스트 순회 중 삭제 시 주의

잘못된 예시 (ConcurrentModificationException 발생)

for (String s : list) {
    if (s.length() == 3) list.remove(s);
}

올바른 방법

List<String> result = new ArrayList<>();
for (String s : list) {
    if (s.length() != 3) result.add(s);
}

또는 Stream API 사용

List<String> result = list.stream()
    .filter(s -> s.length() != 3)
    .collect(Collectors.toList());

 

'Problem Solving > 개념' 카테고리의 다른 글

링크드 리스트  (0) 2025.07.04
정렬  (0) 2025.07.04
완전탐색 (Exhaustive Search) - 반복문을 활용한 접근  (2) 2025.07.04
시간복잡도  (0) 2025.07.04
Java 문자열 처리  (0) 2025.07.04