Home > Algorithm > 2024 > πŸ“¦[DS,Algorithm] μ„ ν˜• 자료ꡬ쑰 - λ°°μ—΄

πŸ“¦[DS,Algorithm] μ„ ν˜• 자료ꡬ쑰 - λ°°μ—΄
DataStructure Algorithm

1️⃣ μ„ ν˜• 자료ꡬ쑰 - λ°°μ—΄.

자료ꡬ쑰 κ΄€μ μ—μ„œ 배열을 μ΄ν•΄ν•˜κ³  μ—¬λŸ¬ λ°©λ²•μœΌλ‘œ κ΅¬ν˜„ κ°€λŠ₯

1️⃣ λ°°μ—΄(Array).

자료ꡬ쑰 κ΄€μ μ—μ„œ λ°°μ—΄(Array)은 λ™μΌν•œ νƒ€μž…μ˜ 데이터λ₯Ό μ—°μ†λœ λ©”λͺ¨λ¦¬ 곡간에 μ €μž₯ν•˜λŠ” μ„ ν˜• μžλ£Œκ΅¬μ‘°μž…λ‹ˆλ‹€.

배열은 μ‘°μ •λœ 크기λ₯Ό κ°€μ§€λ©°, 인덱슀λ₯Ό μ‚¬μš©ν•˜μ—¬ 각 μš”μ†Œμ— λΉ λ₯΄κ²Œ μ ‘κ·Όν•  수 μžˆλŠ” νŠΉμ§•μ΄ μžˆμŠ΅λ‹ˆλ‹€.

배열은 κ°€μž₯ 기본적이고 널리 μ‚¬μš©λ˜λŠ” 자료ꡬ쑰 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€.

νŠΉμ§•.

  1. κ³ μ •λœ 크기(Fixed Size)
    • 배열은 μ„ μ–Έ μ‹œ 크기가 κ²°μ •λ˜λ©°, λ°°μ—΄μ˜ ν¬κΈ°λŠ” λ³€κ²½ν•  수 μ—†μŠ΅λ‹ˆλ‹€. 이 ν¬κΈ°λŠ” 배열을 μ‚¬μš©ν•˜λŠ” λ™μ•ˆ κ³ μ •λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
    • 예: β€˜int[] numbers = new int[10];β€˜(크기가 10인 μ •μˆ˜ν˜• λ°°μ—΄)
  2. μ—°μ†λœ λ©”λͺ¨λ¦¬ 곡간(Contiguous Memory Allocation)
    • λ°°μ—΄μ˜ μš”μ†Œλ“€μ€ λ©”λͺ¨λ¦¬μƒμ— μ—°μ†μ μœΌλ‘œ λ°°μΉ˜λ©λ‹ˆλ‹€. μ΄λŠ” 인덱슀λ₯Ό ν†΅ν•œ λΉ λ₯Έ 접근을 κ°€λŠ₯ν•˜κ²Œ ν•©λ‹ˆλ‹€.
    • 첫 번째 μš”μ†Œμ˜ λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό κΈ°μ€€μœΌλ‘œ 인덱슀λ₯Ό μ‚¬μš©ν•˜μ—¬ λ‹€λ₯Έ μš”μ†Œμ˜ μ£Όμ†Œλ₯Ό 계산할 수 μžˆμŠ΅λ‹ˆλ‹€.
  3. 인덱슀λ₯Ό ν†΅ν•œ μ ‘κ·Ό(Indexing)
    • λ°°μ—΄μ˜ 각 μš”μ†ŒλŠ” 인덱슀λ₯Ό 톡해 μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€. μΈλ±μŠ€λŠ” 0λΆ€ν„° μ‹œμž‘ν•˜μ—¬ λ°°μ—΄μ˜ 크기 -1κΉŒμ§€μ˜ 값을 κ°€μ§‘λ‹ˆλ‹€.
    • 예: β€˜numbers[0]’,’numbers[1]β€˜,…,’numbers[9]β€˜
  4. λ™μΌν•œ 데이터 νƒ€μž…(Homogeneous Data Type)
    • 배열은 λ™μΌν•œ 데이터 νƒ€μž…μ˜ μš”μ†Œλ“€λ‘œ κ΅¬μ„±λ©λ‹ˆλ‹€. 즉, λ°°μ—΄ λ‚΄ λͺ¨λ“  μš”μ†ŒλŠ” 같은 데이터 νƒ€μž…μ΄μ–΄μ•Ό ν•©λ‹ˆλ‹€.
    • 예: μ •μˆ˜ν˜• λ°°μ—΄, λ¬Έμžμ—΄ λ°°μ—΄ λ“±.

μž₯점.

  1. λΉ λ₯Έ μ ‘κ·Ό 속도(Fast Access) :
    • 인덱슀λ₯Ό μ‚¬μš©ν•˜μ—¬ O(1) μ‹œκ°„ λ³΅μž‘λ„λ‘œ λ°°μ—΄μ˜ μž„μ˜μ˜ μš”μ†Œμ— μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” λ°°μ—΄μ˜ μ£Όμš” μž₯점 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€.
  2. κ°„λ‹¨ν•œ κ΅¬ν˜„(Simple Implementation) :
    • 배열은 데이터 ꡬ쑰가 κ°„λ‹¨ν•˜μ—¬ κ΅¬ν˜„μ΄ μš©μ΄ν•©λ‹ˆλ‹€. 기본적인 자료ꡬ쑰둜, λ‹€λ₯Έ λ³΅μž‘ν•œ 자료ꡬ쑰의 κΈ°μ΄ˆκ°€ λ©λ‹ˆλ‹€.

단점.

  1. κ³ μ •λœ 크기(Fixed Size) :
    • λ°°μ—΄μ˜ ν¬κΈ°λŠ” μ„ μ–Έ μ‹œ κ²°μ •λ˜λ©°, 크기λ₯Ό λ³€κ²½ν•  수 μ—†μŠ΅λ‹ˆλ‹€. μ΄λŠ” 크기λ₯Ό 사전에 μ •ν™•νžˆ μ˜ˆμΈ‘ν•˜κΈ° μ–΄λ €μš΄ 경우 λΉ„νš¨μœ¨μ μΌ 수 μžˆμŠ΅λ‹ˆλ‹€.
  2. μ‚½μž… 및 μ‚­μ œμ˜ λΉ„νš¨μœ¨μ„±(Inefficient Insertions and Deletions) :
    • λ°°μ—΄μ˜ 쀑간에 μš”μ†Œλ₯Ό μ‚½μž…ν•˜κ±°λ‚˜ μ‚­μ œν•  경우, μš”μ†Œλ“€μ„ μ΄λ™μ‹œμΌœμ•Ό ν•˜κΈ° λ•Œλ¬Έμ— O(n) μ‹œκ°„μ΄ μ†Œμš”λ©λ‹ˆλ‹€. μ΄λŠ” 큰 λ°°μ—΄μ˜ 경우 μ„±λŠ₯ μ €ν•˜λ₯Ό μ΄ˆλž˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  3. λ©”λͺ¨λ¦¬ λ‚­λΉ„(Memory Waste) :
    • λ°°μ—΄μ˜ 크기λ₯Ό λ„ˆλ¬΄ 크게 μ„€μ •ν•˜λ©΄ μ‚¬μš©λ˜μ§€ μ•ŠλŠ” λ©”λͺ¨λ¦¬κ°€ 낭비될 수 있고, λ„ˆλ¬΄ μž‘κ²Œ μ„€μ •ν•˜λ©΄ μΆ©λΆ„ν•œ 데이터λ₯Ό μ €μž₯ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

λ°°μ—΄μ˜ μ‚¬μš© μ˜ˆμ‹œ.

  • μ •μˆ˜ν˜• λ°°μ—΄ μ„ μ–Έ 및 μ΄ˆκΈ°ν™”
    int[] numbers = new int[5];
    numbers[0] = 10;
    numbers[1] = 20;
    numbers[2] = 30;
    numbers[3] = 40;
    numbers[4] = 50;
    
  • λ°°μ—΄μ˜ μš”μ†Œ μ ‘κ·Ό
    int firstElement = numbers[0]; // 10
    int lastElement = numbers[4]; // 50
    
  • λ°°μ—΄μ˜ 순회
    for (int i = 0; i < numbers.length; i++) {
      System.out.println(numbers[i]);
    }
    

마무리.

배열은 λ‹€μ–‘ν•œ μƒν™©μ—μ„œ 기본적인 데이터 μ €μž₯κ³Ό μ ‘κ·Ό 방법을 μ œκ³΅ν•˜λ©°, νŠΉμ • μš”κ΅¬μ‚¬ν•­μ— 맞좰 λ‹€λ₯Έ μžλ£Œκ΅¬μ‘°μ™€ ν•¨κ»˜ μ‚¬μš©λ˜κΈ°λ„ ν•©λ‹ˆλ‹€.

λ°°μ—΄μ˜ λΉ λ₯Έ μ ‘κ·Ό 속도와 κ°„λ‹¨ν•œ ꡬ쑰 덕뢄에, λ§Žμ€ μ•Œκ³ λ¦¬μ¦˜κ³Ό ν”„λ‘œκ·Έλž¨μ—μ„œ 핡심적인 역할을 ν•©λ‹ˆλ‹€.


2️⃣ λ°°μ—΄ 직접 κ΅¬ν˜„.

// CustomArray 클래슀
public class CustomArray {
  private int[] data;
  private int size;

  // νŠΉμ • μš©λŸ‰μœΌλ‘œ 배열을 μ΄ˆκΈ°ν™”ν•˜λŠ” μƒμ„±μž
  public CustomArray(int capacity) {
    data = new int[capacity];
    size = 0;
  }

  // λ°°μ—΄μ˜ 크기λ₯Ό κ°€μ Έμ˜€λŠ” λ©”μ„œλ“œ
  public int size() {
    return size;
  }

  // 배열이 λΉ„μ–΄ μžˆλŠ”μ§€ ν™•μΈν•˜λŠ” λ©”μ„œλ“œ
  public boolean isEmpty() {
    return size == 0;
  }

  // νŠΉμ • 인덱슀의 μš”μ†Œλ₯Ό κ°€μ Έμ˜€λŠ” λ©”μ„œλ“œ
  public int get(int index) {
    if (index < 0 || index >= size) {
      throw new IndexOutOfBoundsException("Index out of bounds");
    }
    return data[index];
  }

  // νŠΉμ • μΈλ±μŠ€μ— μš”μ†Œλ₯Ό μ„€μ •ν•˜λŠ” λ©”μ„œλ“œ
  public void set(int index, int value) {
    if (index < 0 || index >= size) {
      throw new IndexOutOfBoundsException("Index out of bounds");
    }
    data[index] = value;
  }

  // 배열에 μš”μ†Œλ₯Ό μΆ”κ°€ν•˜λŠ” λ©”μ„œλ“œ
  public void add(int value) {
    if (size == data.length) {
      throw new IllegalStateException("Array is full");
    }
    data[size] = value;
    size++;
  }

  // νŠΉμ • 인덱슀의 μš”μ†Œλ₯Ό μ‚­μ œν•˜λŠ” λ©”μ„œλ“œ
  public void remove(int index) {
    if (index < 0 || index >= size) {
      throw new IndexOutOfBoundsException("Index out of bounds");
    }

    for (int i = index; i < size - 1; i++) {
      data[i] = data[i + 1];
    }
    size--;
  }

  // λͺ¨λ“  μš”μ†Œλ₯Ό 좜λ ₯ν•˜λŠ” λ©”μ„œλ“œ
  public void print() {
    for (int i = 0; i < size; i++) {
      System.out.print(data[i] + " ");
    }
    System.out.println();
  }
}

μ„€λͺ….

  • ν•„λ“œ:
    • β€˜data’ : μ‹€μ œ 데이터λ₯Ό μ €μž₯ν•˜λŠ” λ°°μ—΄.
    • β€˜size’ : ν˜„μž¬ 배열에 μ €μž₯된 μš”μ†Œμ˜ 개수.
  • μƒμ„±μž:
    • β€˜CustomArray(int capacity)’ : 초기 μš©λŸ‰μ„ μ„€μ •ν•˜μ—¬ 배열을 μ΄ˆκΈ°ν™” ν•©λ‹ˆλ‹€.
  • λ©”μ„œλ“œ:
    • β€˜size()’ : ν˜„μž¬ 배열에 μ €μž₯된 μš”μ†Œμ˜ 개수λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
    • β€˜isEmpty()’ : 배열이 λΉ„μ–΄μžˆλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.
    • β€˜get(int index)’ : νŠΉμ • 인덱슀의 μš”μ†Œλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
    • β€˜set(int index, int value)’ : νŠΉμ • 인덱슀의 μš”μ†Œλ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.
    • β€˜add(int value)’ : λ°°μ—΄μ˜ λ§ˆμ§€λ§‰μ— μš”μ†Œλ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€.
    • β€˜remove(int index)’ : νŠΉμ • 인덱슀의 μš”μ†Œλ₯Ό μ œκ±°ν•˜κ³ , μ΄ν›„μ˜ μš”μ†Œλ“€μ„ μ•žμœΌλ‘œ μ΄λ™μ‹œν‚΅λ‹ˆλ‹€.
    • β€˜print()’ : λ°°μ—΄μ˜ λͺ¨λ“  μš”μ†Œλ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.