Home > Algorithm > 2024 > πŸ“¦[DS,Algorithm] Circular Queue(μ›ν˜• 큐)의 쀑간 지점 μ°ΎκΈ°.

πŸ“¦[DS,Algorithm] Circular Queue(μ›ν˜• 큐)의 쀑간 지점 μ°ΎκΈ°.
DataStructure Algorithm

1️⃣ Circular Queue(μ›ν˜• 큐)의 쀑간 지점 μ°ΎκΈ°.

Javaμ—μ„œ 배열을 μ‚¬μš©ν•˜μ—¬ κ΅¬ν˜„ν•œ μ›ν˜• νμ—μ„œ 쀑간 지점을 μ°ΎλŠ” 방법은 큐의 μ‹œμž‘ μœ„μΉ˜(β€˜front’)와 끝 μœ„μΉ˜(β€˜rear’)λ₯Ό κΈ°μ€€μœΌλ‘œ 계산할 수 μžˆμŠ΅λ‹ˆλ‹€.

쀑간 지점을 μ°ΎλŠ” 곡식은 μ›ν˜• 큐의 νŠΉμ„±μ„ κ³ λ €ν•˜μ—¬ 적절히 μ‘°μ •λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

2️⃣ 쀑간 지점을 μ°ΎκΈ° μœ„ν•œ 방법.

1️⃣ 쀑간 지점 계산 곡식.

쀑간 지점을 μ°ΎλŠ” 방법은 큐의 μ‹œμž‘μ κ³Ό 끝점을 μ΄μš©ν•˜μ—¬ 계산할 수 μžˆμŠ΅λ‹ˆλ‹€.

μ›ν˜• 큐의 크기, μ‹œμž‘ 인덱슀(front), 끝 인덱슀(rear)λ₯Ό μ‚¬μš©ν•˜μ—¬ 쀑간 인덱슀λ₯Ό 계산할 수 μžˆμŠ΅λ‹ˆλ‹€.

μ΄λ•Œ 쀑간 지점을 κ³„μ‚°ν•˜λŠ” 곡식은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

(front + size / 2) % capacity

μ—¬κΈ°μ„œ β€˜size’ λŠ” 큐에 ν˜„μž¬ μ €μž₯된 μš”μ†Œμ˜ 수이고, β€˜capacity’ λŠ” 큐의 전체 ν¬κΈ°μž…λ‚˜λ‹€.

3️⃣ μ˜ˆμ‹œ

public class CircularQueue {
    private int[] queue;
    private int front, rear, size, capacity;

    public CircularQueue(int capacity) {
        this.capacity = capacity;
        this.queue = new int[capacity];
        this.front = 0;
        this.rear = 0;
        this.size = 0;
    }

    public boolean isFull() {
        return size == capacity;
    }

    public boolean isEmpty() {
        return size == 0;
    }

    public void enqueue(int data) {
        if (isFull()) {
            throw new RuntimeException("Queue is full");
        }
        queue[rear] = data;
        rear = (rear + 1) % capacity;
        size++;
    }

    public int dequeue() {
        if (isEmpty()) {
            throw new RuntimeException("Queue is empty");
        }
        int data = queue[front];
        front = (front + 1) % capacity;
        size--;
        return data;
    }

    public int getMiddle() {
        if (isEmpty()) {
            throw new RuntimeException("Queue is empty");
        }
        int middleIndex = (front + size / 2) % capacity;
        return queue[middleIndex];
    }

    public static void main(String[] args) {
        CircularQueue cq = new CircularQueue(5);
        cq.enqueue(10);
        cq.enqueue(20);
        cq.enqueue(30);
        cq.enqueue(40);
        cq.enqueue(50);
        
        System.out.println("Middle element: " + cq.getMiddle());  // Output: Middle element: 30
        
        cq.dequeue();
        cq.enqueue(60);
        
        System.out.println("Middle element: " + cq.getMiddle());  // Output: Middle element: 40
    }
}

이 μ½”λ“œμ—μ„œλŠ” β€˜CircularQueue’ 클래슀λ₯Ό μ •μ˜ν•˜κ³ , β€˜enqueue’, β€˜dequeue’, β€˜isFull’, β€˜isEmpty’ λ©”μ„œλ“œλ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€.

λ˜ν•œ, 큐의 쀑간 μš”μ†Œλ₯Ό λ°˜ν™˜ν•˜λŠ” β€˜getMiddle’ λ©”μ„œλ“œλ₯Ό μ •μ˜ν•©λ‹ˆλ‹€.

이 λ©”μ„œλ“œλŠ” ν˜„μž¬ 큐의 크기와 μ‹œμž‘ 인덱슀λ₯Ό μ‚¬μš©ν•˜μ—¬ 쀑간 인덱슀λ₯Ό κ³„μ‚°ν•œ ν›„ ν•΄λ‹Ή 인덱슀의 μš”μ†Œλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.