Post

πŸ’š 자료ꡬ쑰 - μŠ€νƒ, 큐에 λŒ€ν•΄ μ„€λͺ…ν•˜μ‹œμ˜€.

πŸ’š 자료ꡬ쑰 - μŠ€νƒ, 큐에 λŒ€ν•΄ μ„€λͺ…ν•˜μ‹œμ˜€.

9) 자료ꡬ쑰 - μŠ€νƒ, 큐에 λŒ€ν•΄ μ„€λͺ…ν•˜μ‹œμ˜€.

μŠ€νƒ(stack)

LIFO(Last In First Out) ν˜•νƒœλ‘œ 데이터λ₯Ό μ €μž₯ν•˜λŠ” ꡬ쑰

  • μ£Όμš” λ™μž‘

    • push(value) : 데이터λ₯Ό μ§‘μ–΄λ„£λŠ” μ—­ν• 

    • pop() : 데이터λ₯Ό λΉΌλ‚΄λŠ” μ—­ν• 

    • peek(value) : 데이터λ₯Ό λΉΌλ‚΄μ§€ μ•Šμ§€λ§Œ κ°€μž₯ μ΅œμƒλ‹¨μ— μžˆλŠ” 데이터λ₯Ό ν™•μΈν•˜λŠ” μ—­ν• 

  • νŠΉμ§•

    • 같은 ꡬ쑰와 크기의 자료λ₯Ό μ •ν•΄μ§„ λ°©ν–₯으둜만 μŒ“μ„ 수 있고 top으둜 μ •ν•œ 곳을 ν†΅ν•΄μ„œλ§Œ μ ‘κ·Όν•  수 μžˆλ‹€.

    • topμ—λŠ” κ°€μž₯ μœ„μ— μžˆλŠ” μžλ£ŒλŠ” κ°€μž₯ μ΅œκ·Όμ— λ“€μ–΄μ˜¨ 자료λ₯Ό 가리킀며 μ‚½μž…λ˜λŠ” μƒˆ μžλ£ŒλŠ” top이 κ°€λ¦¬ν‚€λŠ” 자료의 μœ„μ— μŒ“μ΄κ²Œ λœλ‹€.

    • μŠ€νƒμ€ μ‹œκ°„ μˆœμ„œμ— 따라 μžλ£Œκ°€ μŒ“μ—¬μ„œ κ°€μž₯ λ§ˆμ§€λ§‰μ— μ‚½μž…λœ μžλ£Œκ°€ κ°€μž₯ λ¨Όμ € μ‚­μ œλœλ‹€λŠ” ꡬ쑰적 νŠΉμ§•μ„ κ°€μ§€κ²Œ λœλ‹€.

    • λΉ„μ–΄μžˆλŠ” μŠ€νƒμ—μ„œ μ›μ†Œλ₯Ό μΆ”μΆœν•˜λ €κ³  ν•  λ•Œ stack underflow라고 ν•˜κ³  μŠ€νƒμ΄ λ„˜μΉ˜λŠ” 경우 stack overflow라고 ν•œλ‹€.

  • λ™μž‘ 방식

    1

  • ν™œμš© μ˜ˆμ‹œ

    • μ›Ή λΈŒλΌμš°μ € 방문기둝(λ’€λ‘œ κ°€κΈ°) : κ°€μž₯ λ‚˜μ€‘μ— μ—΄λ¦° νŽ˜μ΄μ§€λΆ€ν„° λ‹€μ‹œ λ³΄μ—¬μ€Œ

    • μ—­μˆœ λ¬Έμžμ—΄ λ§Œλ“€κΈ° : κ°€μž₯ λ‚˜μ€‘μ— μž…λ ₯된 λ¬ΈμžλΆ€ν„° 좜λ ₯

    • μ‹€ν–‰ μ·¨μ†Œ(undo) : κ°€μž₯ λ‚˜μ€‘μ— μ‹€ν–‰λœ 것뢀터 싀행을 μ·¨μ†Œ

    • ν›„μœ„ ν‘œκΈ°λ²•

    • μˆ˜μ‹μ˜ κ΄„ν˜Έ 검사

  • μ½”λ“œ

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
      Stack<Integer> stack = new Stack<>();
    
      stack.push(1); // 1
      stack.push(2); // 1 2 
      stack.push(3); // 1 2 3
    
      stack.pop(); // 1 2
      stack.peek(); // 2
    
      // μŠ€νƒμ΄ λΉ„μ–΄μžˆλŠ”μ§€ 확인
      System.out.println(stackInt.isEmpty()); // false
    
      // μ°ΎλŠ” 인덱슀의 κ°’
      System.out.println(stackInt.search(1)); // 2
    

큐(queue)

FIFO(First In First Out) ν˜•νƒœλ‘œ 데이터λ₯Ό μ €μž₯ν•˜λŠ” ꡬ쑰

μˆœμ„œ 보μž₯

  • μ£Όμš” λ™μž‘

    • enqueue : 데이터λ₯Ό μ§‘μ–΄λ„£λŠ” μ—­ν• 

      • add(value) : valueλ₯Ό 맨 뒀에 λ„£μŒ. μ„±κ³΅ν•˜λ©΄ true, μ‹€νŒ¨ν•˜λ©΄ μ˜ˆμ™Έ λ°œμƒ

      • offer(value) : valueλ₯Ό 맨 뒀에 λ„£μŒ. μ„±κ³΅ν•˜λ©΄ true, μ‹€νŒ¨ν•˜λ©΄ false λ°˜ν™˜

    • dequeue : 데이터λ₯Ό λΉΌλ‚΄λŠ” μ—­ν• 

      • remove() : 맨 μ•žμ˜ 값을 λ°˜ν™˜ ν›„ 제거. 큐가 λΉ„μ–΄μžˆλ‹€λ©΄ μ˜ˆμ™Έ λ°œμƒ
    • peek() : 데이터λ₯Ό λΉΌλ‚΄μ§€ μ•Šμ§€λ§Œ 이제 κ³§ κΊΌλ‚΄κ²Œ 될 데이터λ₯Ό ν™•μΈν•˜λŠ” μ—­ν• 

  • νŠΉμ§•

    • μ •ν•΄μ§„ ν•œ κ³³(top)을 톡해 μ‚½μž…, μ‚­μ œκ°€ μ΄λ£¨μ–΄μ§€λŠ” μŠ€νƒκ³ΌλŠ” 달리 νλŠ” ν•œμͺ½ λμ—μ„œ μ‚½μž… μž‘μ—…μ΄, λ‹€λ₯Έ μͺ½ λμ—μ„œ μ‚­μ œ μž‘μ—…μ΄ μ–‘μͺ½μœΌλ‘œ 이루어진닀.

    • μ‚­μ œ μ—°μ‚°λ§Œ μˆ˜ν–‰λ˜λŠ” 곳을 ν”„λ‘ νŠΈ(front), μ‚½μž… μ—°μ‚°λ§Œ μ΄λ£¨μ–΄μ§€λŠ” 곳을 리어(rear)둜 μ •ν•˜μ—¬ 각각의 μ—°μ‚° μž‘μ—…λ§Œ μˆ˜ν–‰λœλ‹€.

    • μ—¬κΈ°μ„œ 큐의 λ¦¬μ–΄μ—μ„œ μ΄λ£¨μ–΄μ§€λŠ” μ‚½μž… 연산을 인큐(enQueue), ν”„λ‘ νŠΈμ—μ„œ μ΄λ£¨μ–΄μ§€λŠ” μ‚­μ œ 연산을 디큐(dnQueue)라고 뢀름.

  • λ™μž‘ 방식

    1

  • ν™œμš© μ˜ˆμ‹œ

    • μš°μ„  μˆœμœ„κ°€ 같은 μž‘μ—… μ˜ˆμ•½ (ν”„λ¦°ν„°μ˜ 인쇄 λŒ€κΈ°μ—΄)

    • 은행 업무

    • μ½œμ„Όν„° 고객 λŒ€κΈ°μ‹œκ°„

    • ν”„λ‘œμ„ΈμŠ€ 관리

    • λ„ˆλΉ„ μš°μ„  탐색(BFS)

    • μΊμ‹œ κ΅¬ν˜„

  • μ½”λ“œ

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
      Queue<μžλ£Œν˜•> q = new LinkedList<>();
    
      Queue<Integer> q = new LinkedList<>();
    
      q.add(1); // μ„±κ³΅μ‹œ true, μ‹€νŒ¨μ‹œ exception λ°˜ν™˜
      q.offer(1); // μ„±κ³΅μ‹œ true, μ‹€νŒ¨μ‹œ false λ°˜ν™˜
    
      q.remove(); // μ‚­μ œλœ value / 곡백 큐이면 Exception λ°œμƒ
      q.remove(1); // ν•΄λ‹Ή κ°’ μ‚­μ œ ν›„ true, μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ false λ°˜ν™˜
    
      q.poll(); // μ‚­μ œλœ value, 곡백 큐이면 null λ°˜ν™˜
    
      q.element(); // 큐 head에 μœ„μΉ˜ν•œ value / 곡백 큐이면 Exception λ°œμƒ
    
      q.peek(); // 큐 head에 μœ„μΉ˜ν•œ value / 곡백 큐이면 null λ°˜ν™˜
    
      q.clear(); // 큐 μ΄ˆκΈ°ν™”
    
      q.size(); // 큐 μ‚¬μ΄μ¦ˆ λ°˜ν™˜
    
      q.contains(1); // ν•΄λ‹Ή 값이 μ‘΄μž¬ν•˜λ©΄ true / μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ false λ°˜ν™˜
    
      q.isEmpty(); // 곡백 큐이면 ture / μ•„λ‹ˆλ©΄ false λ°˜ν™˜ 
    


μ—λŸ¬

StackOverflowError : μŠ€νƒ λ©”λͺ¨λ¦¬ 곡간을 λ‹€ 썼을 λ•Œ λ°œμƒν•˜λŠ” μ—λŸ¬

❓: λŒ€λΆ€λΆ„ μž¬κ·€ν•¨μˆ˜(recursive function)μ—μ„œ νƒˆμΆœ λͺ»ν•΄μ„œ λ°œμƒ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Fibonacci {

    public static int recurFibo(int n) {
        if (n <= 1) {
            return n;
        } else {
            return recurFibo(n - 1) + recurFibo(n - 2);
        }
    }

    public static void main(String[] args) {
        int n = 10; 
        for (int i = 0; i < n; i++) {
            System.out.print(recurFibo(i) + " ");
        }
    }
}

ν”Όλ³΄λ‚˜μΉ˜ μˆ˜μ—΄μ—μ„œ n번째 ν•­λͺ©μ΄ μ–΄λ–€ 값을 κ°€μ§€λŠ”μ§€λ₯Ό κ³„μ‚°ν•˜λŠ” ν•¨μˆ˜λ‘œ μž¬κ·€ ν•¨μˆ˜μ˜ μ „ν˜•μ μΈ 예λ₯Ό μ½”λ“œλ‘œ κ°€μ Έμ™”λ‹€.

recurFibo()λΌλŠ” ν•¨μˆ˜λ₯Ό λ‚΄λΆ€μ—μ„œλ„ ν˜ΈμΆœμ„ ν•˜κ³ μžˆλ‹€. μ΄λ ‡κ²Œ 자기 μžμ‹ μ„ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ ν˜ΈμΆœν•˜λŠ” 것을 μž¬κ·€ν•¨μˆ˜λΌκ³  ν•˜κ³  μ€‘μš”ν•œ 뢀뢄은 if(n<=1) 처럼 νƒˆμΆœμ‘°κ±΄μ΄ μ‘΄μž¬ν•œλ‹€.

ν•˜μ§€λ§Œ κ°œλ°œμ„ ν•˜λ‹€ νƒˆμΆœ 쑰건을 적기 κΉŒλ¨Ήκ±°λ‚˜ 잘λͺ» μ μ–΄μ„œ ν•¨μˆ˜ ν˜ΈμΆœμ€ μ‹œμž‘ν–ˆμ§€λ§Œ 끝이 μ‘΄μž¬ν•˜μ§€ μ•Šμ•„ μŠ€νƒ λ©”λͺ¨λ¦¬λ₯Ό λ‹€ 썼을 λ•Œ StackOverflowError κ°€ λ°œμƒν•œλ‹€.

❗ : 즉, ν•΄κ²° 방법은 νƒˆμΆœ 쑰건을 잘 λͺ…μ‹œν•˜λ©΄ λœλ‹€!


OutOfMemoryError : Java의 νž™(heap) λ©”λͺ¨λ¦¬λ₯Ό λ‹€ 썼을 λ•Œ λ°œμƒ

μ—¬κΈ°μ„œ νž™(heap) λ©”λͺ¨λ¦¬λŠ” 객체가 κ±°μ£Όν•˜λŠ” λ©”λͺ¨λ¦¬ μ˜μ—­μž„

❓ : λ‚΄λΆ€μ μœΌλ‘œ 큐λ₯Ό μ‚¬μš©ν–ˆλŠ”λ° 큐에 데이터가 계속 μŒ“μ΄κΈ°λ§Œ ν•œλ‹€λ©΄ λ°œμƒν•œλ‹€.

❗ : ν•΄κ²° 방법은 큐 μ‚¬μ΄μ¦ˆλ₯Ό κ³ μ •ν•˜λ©΄ λœλ‹€.

ν•˜μ§€λ§Œ 큐가 λ‹€ μ°¬λ‹€λ©΄ μ–΄λ–»κ²Œ ν•΄κ²° ν•΄μ•Όλ κΉŒ?

  • μ˜ˆμ™Έ(exception) λ˜μ§€κΈ°

  • νŠΉλ³„ν•œ κ°’(null or false) λ°˜ν™˜

  • 성곡할 λ•ŒκΉŒμ§€(큐에 곡간이 생길 λ•ŒκΉŒμ§€) μ˜μ›νžˆ μŠ€λ ˆλ“œ 블락(λŒ€κΈ°)

  • μ œν•œλœ μ‹œκ°„λ§Œ 블락(block)되고 κ·Έλž˜λ„ μ•ˆλ˜λ©΄ 포기

Javaμ—μ„œ 이런 4κ°€μ§€ 방식을 κ΅¬ν˜„ν•œ λͺ‡λͺ‡ ν΄λž˜μŠ€λ“€μ΄ μžˆλŠ”λ° κ·Έ 쀑에 ν•˜λ‚˜κ°€ LinkedBlockingQueue이닀.

This post is licensed under CC BY 4.0 by the author.