Home > Algorithm > 2024 > πŸ“¦[DS,Algorithm] Java의 λ°°μ—΄.

πŸ“¦[DS,Algorithm] Java의 λ°°μ—΄.
DataStructure Algorithm

1️⃣ Java의 λ°°μ—΄.

1️⃣ λ°°μ—΄μ΄λž€ 무엇인가?

λ°°μ—΄(Array)은 λ™μΌν•œ νƒ€μž…μ˜ μ—¬λŸ¬ μš”μ†Œλ₯Ό ν•˜λ‚˜μ˜ λ³€μˆ˜λ‘œ 관리할 수 있게 ν•΄μ£ΌλŠ” μžλ£Œκ΅¬μ‘°μž…λ‹ˆλ‹€.

배열은 μ—°μ†λœ λ©”λͺ¨λ¦¬ 곡간에 ν• λ‹Ήλ˜λ©°, 각 μš”μ†ŒλŠ” 인덱슀λ₯Ό 톡해 μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

2️⃣ λ°°μ—΄μ˜ μ„ μ–Έκ³Ό μ΄ˆκΈ°ν™”.

Javaμ—μ„œ 배열은 λ‹€μŒκ³Ό 같이 μ„ μ–Έν•˜κ³  μ΄ˆκΈ°ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

int[] array = new int[5]; // 크기가 5인 μ •μˆ˜ν˜• λ°°μ—΄ μ„ μ–Έ.
int[] array = {10, 20, 30, 40, 50}; // μ΄ˆκΈ°ν™”μ™€ λ™μ‹œμ— λ°°μ—΄ μ„ μ–Έ

3️⃣ λ°°μ—΄μ˜ μš”μ†Œμ™€ μ ‘κ·Ό.

λ°°μ—΄μ˜ 각 μš”μ†ŒλŠ” 인덱슀λ₯Ό 톡해 μ ‘κ·Όν•  수 있으며, μΈλ±μŠ€λŠ” 0λΆ€ν„° μ‹œμž‘ν•©λ‹ˆλ‹€.

int firstElement = array[0]; // element = 10, 첫 번째 μš”μ†Œμ— μ ‘κ·Ό
array[1] = 25; // [10, 25, 30, 40, 50], 두 번째 μš”μ†Œμ— κ°’ 25λ₯Ό μ €μž₯

4️⃣ λ°°μ—΄μ˜ μ‹œκ°„ λ³΅μž‘λ„.

λ°°μ—΄μ˜ μ‹œκ°„ λ³΅μž‘λ„λŠ” μ—°μ‚°μ˜ μ’…λ₯˜μ— 따라 λ‹€λ¦…λ‹ˆλ‹€.

μ•„λž˜λŠ” 일반적인 λ°°μ—΄ μ—°μ‚°κ³Ό κ·Έ μ‹œκ°„ λ³΅μž‘λ„λ₯Ό μ„€λͺ…ν•œ κ²ƒμž…λ‹ˆλ‹€.

1. μ ‘κ·Ό(Access)

  • νŠΉμ • 인덱슀의 μš”μ†Œμ— μ ‘κ·Όν•˜λŠ” μ‹œκ°„ λ³΅μž‘λ„λŠ” O(1)μž…λ‹ˆλ‹€.
    • 이유 : 배열은 μ—°μ†λœ λ©”λͺ¨λ¦¬ 곡간에 μ €μž₯λ˜λ―€λ‘œ 인덱슀λ₯Ό 톡해 λ°”λ‘œ μ ‘κ·Όν•  수 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€.
// μ ‘κ·Ό(Access)
int element = array[2]; 
// element = 30,  time complexity = O(1)
// [10, 25, 30, 40, 50]

2. 탐색(Search)

  • λ°°μ—΄μ—μ„œ νŠΉμ • 값을 μ°ΎλŠ” μ‹œκ°„ λ³΅μž‘λ„λŠ” O(n)μž…λ‹ˆλ‹€.
    • 이유: μ΅œμ•…μ˜ 경우 λ°°μ—΄μ˜ λͺ¨λ“  μš”μ†Œλ₯Ό 검사해야 ν•  μˆ˜λ„ 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€.
boolean found = false;
int target = 30;

for (int i = 0; i < array.length; i++) {
    if (array[i] == target) { // i = 2, array[i] = 30
        found = true;
        break;
    }
}
// [10, 25, 30, 40, 50]

3. μ‚½μž…(Insertion)

  • λ°°μ—΄μ˜ 끝에 μš”μ†Œλ₯Ό μΆ”κ°€ν•˜λŠ” μ‹œκ°„ λ³΅μž‘λ„λŠ” O(1)μž…λ‹ˆλ‹€.
  • λ°°μ—΄μ˜ νŠΉμ • μœ„μΉ˜μ— μš”μ†Œλ₯Ό μ‚½μž…ν•˜λŠ” μ‹œκ°„ λ³΅μž‘λ„λŠ” O(n)μž…λ‹ˆλ‹€.
    • 이유: νŠΉμ • μœ„μΉ˜μ— μ‚½μž…ν•˜κΈ° μœ„ν•΄μ„œλŠ” ν•΄λ‹Ή μœ„μΉ˜ μ΄ν›„μ˜ λͺ¨λ“  μš”μ†Œλ₯Ό ν•œ μΉΈμ”© λ’€λ‘œ λ°€μ–΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.
// μ‚½μž…(Insertion)

// λ°°μ—΄ μ‚½μž…μ‹œ indexκ°€ array.lengthκ°€ μ•„λ‹ˆκ³  array.length - 1인 μ΄μœ λŠ”
// array.lengthλŠ” λ°°μ—΄μ˜ 크기, 즉 5λ₯Ό λ‚˜νƒ€λ‚΄κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.
// indexλŠ” 0λΆ€ν„° μ‹œμž‘ν•˜κΈ° λ•Œλ¬Έμ— λ°°μ—΄μ˜ 크기가 5인 λ°°μ—΄μ˜ 끝 indexλŠ” 4μž…λ‹ˆλ‹€.
// λ•Œλ¬Έμ— array.length - 1을 ν•΄μ€λ‹ˆλ‹€.

array[array.length - 1] = 60; // λ°°μ—΄ 끝에 μ‚½μž… (O(1)), [10, 25, 30, 40, 60]

// λ°°μ—΄ 쀑간에 μ‚½μž…ν•˜λŠ” λ©”μ„œλ“œ
public static void insertion(int[] array, int index, int insertValue) {
  // λ°°μ—΄ 쀑간에 μ‚½μž…(O(n))
  for (int i = array.length - 1; i > index; i--) {
    array[i] = array[i - 1];
  }
  array[index] = insertValue;
  System.out.println(Arrays.toString(array));
}

4. μ‚­μ œ(Deletion)

  • λ°°μ—΄μ˜ λμ—μ„œ μš”μ†Œλ₯Ό μ œκ±°ν•˜λŠ” μ‹œκ°„ λ³΅μž‘λ„λŠ” O(1)μž…λ‹ˆλ‹€.
  • λ°°μ—΄μ˜ νŠΉμ • μœ„μΉ˜μ˜ μš”μ†Œλ₯Ό μ œκ±°ν•˜λŠ” μ‹œκ°„ λ³΅μž‘λ„λŠ” O(n)μž…λ‹ˆλ‹€.
    • 이유: νŠΉμ • μœ„μΉ˜μ˜ μš”μ†Œλ₯Ό μ œκ±°ν•œ ν›„μ—λŠ” ν•΄λ‹Ή μœ„μΉ˜ μ΄ν›„μ˜ λͺ¨λ“  μš”μ†Œλ₯Ό ν•œ μΉΈμ”© μ•žμœΌλ‘œ 당겨야 ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.
// μ‚­μ œ(Deletion)
    array[array.length - 1] = 0; // λ°°μ—΄μ˜ λμ—μ„œ μ‚­μ œ ((O(1)), [10, 25, 30, 77, 0]
    System.out.println(Arrays.toString(array));

    // λ°°μ—΄ μ€‘κ°„μ—μ„œ μ‚­μ œν•˜λŠ” λ©”μ„œλ“œ
    int deletionValue = deletion(array, 2);
    System.out.println(deletionValue); // 30

// λ°°μ—΄ 쀑간에 μ‚­μ œν•˜λŠ” λ©”μ„œλ“œ
  public static int deletion(int[] array, int index) {
    // λ°°μ—΄ 쀑간에 μ‚­μ œ(O(n))
    int[] returnValue = new int[array.length];

    for (int i = index, j = 0; i < array.length - 1 ; i++) {
      returnValue[j] = array[i];
      j++;
      array[i] = array[i + 1];

    }
    array[array.length - 1] = 0; // λ§ˆμ§€λ§‰ μš”μ†Œ μ΄ˆκΈ°ν™”.
    int deletionValue = returnValue[0]; // 배열을 λ©”λͺ¨λ¦¬μ—μ„œ μ§€μš°κΈ°
    returnValue = null;
    return deletionValue;
  }

5️⃣ λ°°μ—΄μ˜ μž₯점과 단점.

μž₯점.

  • λΉ λ₯Έ μ ‘κ·Ό 속도 : 인덱슀λ₯Ό 톡해 O(1) μ‹œκ°„μ— μš”μ†Œλ₯Ό μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • λ©”λͺ¨λ¦¬ 효율 : μ—°μ†λœ λ©”λͺ¨λ¦¬ 곡간을 μ‚¬μš©ν•˜λ―€λ‘œ λ©”λͺ¨λ¦¬ μ‚¬μš©μ΄ νš¨μœ¨μ μž…λ‹ˆλ‹€.

단점.

  • κ³ μ •λœ 크기 : λ°°μ—΄μ˜ ν¬κΈ°λŠ” μ„ μ–Έ μ‹œμ— κ³ μ •λ˜λ―€λ‘œ, μ‹€ν–‰ 쀑에 크기λ₯Ό λ³€κ²½ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
  • μ‚½μž… 및 μ‚­μ œμ˜ λΉ„νš¨μœ¨μ„± : λ°°μ—΄ 쀑간에 μš”μ†Œλ₯Ό μ‚½μž…ν•˜κ±°λ‚˜ μ‚­μ œν•  λ•Œ O(n)의 μ‹œκ°„μ΄ μ†Œμš”λ©λ‹ˆλ‹€.
  • μ—°μ†λœ λ©”λͺ¨λ¦¬ ν• λ‹Ή ν•„μš” : 큰 배열을 μ‚¬μš©ν•  λ–„λŠ” μ—°μ†λœ λ©”λͺ¨λ¦¬ 곡간이 ν•„μš”ν•˜μ—¬ λ©”λͺ¨λ¦¬ 할당에 μ œν•œμ΄ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

배열은 μ΄λŸ¬ν•œ νŠΉμ„±λ“€λ‘œ 인해 λΉ λ₯Έ 접근이 ν•„μš”ν•œ μƒν™©μ—μ„œλŠ” 맀우 μœ μš©ν•˜μ§€λ§Œ, μ‚½μž… 및 μ‚­μ œκ°€ 빈번히 μΌμ–΄λ‚˜λŠ” κ²½μš°μ—λŠ” λΉ„νš¨μœ¨μ μΌ 수 μžˆμŠ΅λ‹ˆλ‹€.
λ”°λΌμ„œ 상황에 맞게 μ μ ˆν•œ 자료ꡬ쑰λ₯Ό μ„ νƒν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€.