Home > Algorithm > 2024 > πŸ“¦[DS,Algorithm] Dequeμ—μ„œμ˜ front와 rear의 λ³€ν™”.

πŸ“¦[DS,Algorithm] Dequeμ—μ„œμ˜ front와 rear의 λ³€ν™”.
DataStructure Algorithm

🧨 μ‹œλ°œμ .

Deque을 κ³΅λΆ€ν•˜λ˜ 쀑 λ™μ μœΌλ‘œ λ³€ν•˜λŠ” front와 rearκ°€ 근본적으둜 μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ”μ§€ κΆκΈˆν•΄μ‘ŒμŠ΅λ‹ˆλ‹€.

이것을 μ•Œκ²Œλ˜λ©΄ μ •ν™•ν•˜κ²Œ Deque의 addFirst, addLast, removeFirst, removeLast μ‹œ front와 rearκ°€ 어디에 μœ„μΉ˜ν•˜λŠ”μ§€ μ•Œ 수 있고 Deque의 원리λ₯Ό 이해 ν•  수 μžˆμ„ 것 κ°™μ•˜μŠ΅λ‹ˆλ‹€.

1️⃣ Deque의 front와 rear의 μœ„μΉ˜λŠ” λ³€ν•  수 μžˆλ‚˜μš”? πŸ€”

β€˜Dequeβ€˜ (Double Ended Queue)μ—μ„œ β€˜frontβ€˜ 와 β€˜rearβ€˜ 의 μœ„μΉ˜λŠ” λ³€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

β€˜Dequeβ€˜ λŠ” μ–‘μͺ½ λμ—μ„œ μ‚½μž…κ³Ό μ‚­μ œκ°€ λͺ¨λ‘ κ°€λŠ₯ν•œ 자료ꡬ쑰이기 λ•Œλ¬Έμ—, β€˜frontβ€˜ 와 β€˜rearβ€˜ 의 μœ„μΉ˜λŠ” 데이터가 μ‚½μž…λ˜κ±°λ‚˜ 제거될 λ•Œλ§ˆλ‹€ λ³€ν•©λ‹ˆλ‹€.

2️⃣ Dequeμ—μ„œμ˜ front와 rear의 λ³€ν™”. 🀩

1️⃣ μ‚½μž… μ—°μ‚° (β€˜addFirstβ€˜ 와 β€˜addLastβ€˜)

  • β€˜addFirst’ : μš”μ†Œλ₯Ό 덱의 μ•žμͺ½μ— μ‚½μž…ν•©λ‹ˆλ‹€.
    • β€˜frontβ€˜ μœ„μΉ˜κ°€ λ°”λ€λ‹ˆλ‹€.
  • β€˜addLast’ : μš”μ†Œλ₯Ό 덱의 λ’€μͺ½μ— μ‚½μž…ν•©λ‹ˆλ‹€.
    • β€˜rearβ€˜ μœ„μΉ˜κ°€ λ°”λ€λ‹ˆλ‹€.

2️⃣ μ‚­μ œ μ—°μ‚° (β€˜removeFirstβ€˜ 와 β€˜removeLastβ€˜)

  • β€˜removeFirst’ : 덱의 μ•žμͺ½μ—μ„œ μš”μ†Œλ₯Ό μ œκ±°ν•©λ‹ˆλ‹€.
    • β€˜frontβ€˜ μœ„μΉ˜κ°€ λ°”λ€λ‹ˆλ‹€.
  • β€˜removeLast’ : 덱의 λ’€μͺ½μ—μ„œ μš”μ†Œλ₯Ό μ œκ±°ν•©λ‹ˆλ‹€.
    • β€˜rearβ€˜ μœ„μΉ˜κ°€ λ°”λ€λ‹ˆλ‹€.

3️⃣ 예제 μ½”λ“œ.

μ•„λž˜λŠ” β€˜Deque’ 의 β€˜LinkedList’ κ΅¬ν˜„μ„ μ‚¬μš©ν•˜μ—¬ β€˜front’ 와 β€˜rear’ 의 λ³€ν™”λ₯Ό λ³΄μ—¬μ£ΌλŠ” 예제 μ½”λ“œμž…λ‹ˆλ‹€.

import java.util.Deque;
import java.util.LinkedList;

public class DequeExample {
	public static void main(String[] args) {
		Deque<String> deque = new LinkedList<>();

		// μš”μ†Œλ₯Ό 덱의 μ•žκ³Ό 뒀에 μΆ”κ°€
		deque.addFirst("A"); // front: A
		deque.addLast("B"); // rear: B
		deque.addFirst("C"); // front: C, rear: B
		deque.addLast("D"); // rear: D

		System.out.println("Initial Deque: " + deque); // 좜λ ₯ : [C,A,B,D]

		// μ•žμͺ½μ—μ„œ μš”μ†Œ 제거
		System.out.println("Removed from front: " + deque.removeFirst()); // 좜λ ₯: C

		// λ’€μͺ½μ—μ„œ μš”μ†Œ 제거
		System.out.println("Removed from rear: " + deque.removeLast()); // 좜λ ₯: D

		System.out.println("Deque after removals: " + deque); // 좜λ ₯: [A, B]

		// 덱의 μ•žμͺ½κ³Ό λ’€μͺ½μ—μ„œ μš”μ†Œ 확인
		System.out.println("Front element: " + deque.getFirst()); // 좜λ ₯: A
		System.out.println("Rear element: " + deque.getLast()); // 좜λ ₯: B
	}
}

πŸ‘‰ μ„€λͺ….

1️⃣ μ‚½μž… μ—°μ‚°.

  • β€˜deque.addFirst(β€œA”)’ : β€œA”λ₯Ό 덱의 μ•žμ— μ‚½μž…ν•©λ‹ˆλ‹€.

  • β€˜deque.addLast(β€œB”)’ : β€œB”λ₯Ό 덱의 뒀에 μ‚½μž…ν•©λ‹ˆλ‹€.

  • β€˜deque.addFirst(β€œC”)’ : β€œC”λ₯Ό 덱의 μ•žμ— μ‚½μž…ν•©λ‹ˆλ‹€.

  • β€˜deque.addLast(β€œD”)’ : β€œD”λ₯Ό 덱의 뒀에 μ‚½μž…ν•©λ‹ˆλ‹€.

이 연산듀은 β€˜front’ 와 β€˜rear’ 의 μœ„μΉ˜λ₯Ό μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€.

2️⃣ μ‚­μ œ μ—°μ‚°.

  • β€˜deque.removeFirst()’ : 덱의 μ•žμͺ½μ—μ„œ β€œC”λ₯Ό μ œκ±°ν•©λ‹ˆλ‹€.

  • β€˜deque.removeLast()’ : 덱의 λ’€μͺ½μ—μ„œ β€œD”λ₯Ό μ œκ±°ν•©λ‹ˆλ‹€.

이 연산듀은 β€˜front’ 와 β€˜rear’ 의 μœ„μΉ˜λ₯Ό λ‹€μ‹œ μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€.

3️⃣ μš”μ†Œ 확인.

  • β€˜deque.getFirst()’ : 덱의 μ•žμͺ½ μš”μ†Œλ₯Ό ν™•μΈν•©λ‹ˆλ‹€.

  • β€˜deque.getLast()’ : 덱의 λ’€μͺ½ μš”μ†Œλ₯Ό ν™•μΈν•©λ‹ˆλ‹€.

이 μ˜ˆμ‹œ μ½”λ“œλŠ” β€˜front’ 와 β€˜rear’ κ°€ λ°μ΄ν„°μ˜ μ‚½μž… 및 μ‚­μ œ 연산에 따라 μ–΄λ–»κ²Œ λ³€ν•˜λŠ”μ§€ 잘 λ³΄μ—¬μ€λ‹ˆλ‹€.
β€˜Deque’ λŠ” 이처럼 μ–‘μͺ½ λμ—μ„œμ˜ μ‚½μž…κ³Ό μ‚­μ œ 연산을 μ§€μ›ν•˜λ―€λ‘œ, β€˜front’ 와 β€˜rear’ 의 μœ„μΉ˜λŠ” λ™μ μž…λ‹ˆλ‹€.