Leetcode Java Design Circular Deque
업데이트:
문제
코드
class MyCircularDeque {
private int[] deque;
private int front;
private int rear;
private int max;
private int size;
public MyCircularDeque(int k) {
this.deque = new int[k];
this.max = k;
this.rear = 1;
}
public boolean insertFront(int value) {
if (this.isFull()) {
return false;
} else {
this.front = (this.front + 1) % this.max;
this.deque[this.front] = value;
this.size++;
return true;
}
}
public boolean insertLast(int value) {
if (this.isFull()) {
return false;
} else {
this.rear = ((this.rear - 1) + this.max) % this.max;
this.deque[this.rear] = value;
this.size++;
return true;
}
}
public boolean deleteFront() {
if (this.isEmpty()) {
return false;
} else {
this.front = ((this.front - 1) + this.max) % this.max;
this.size--;
return true;
}
}
public boolean deleteLast() {
if (this.isEmpty()) {
return false;
} else {
this.rear = (this.rear + 1) % this.max;
this.size--;
return true;
}
}
public int getFront() {
return this.size == 0 ? -1 : this.deque[this.front];
}
public int getRear() {
return this.size == 0 ? -1 : this.deque[this.rear];
}
public boolean isEmpty() {
return this.size == 0;
}
public boolean isFull() {
return this.size == this.max;
}
}
/**
* Your MyCircularDeque object will be instantiated and called as such:
* MyCircularDeque obj = new MyCircularDeque(k);
* boolean param_1 = obj.insertFront(value);
* boolean param_2 = obj.insertLast(value);
* boolean param_3 = obj.deleteFront();
* boolean param_4 = obj.deleteLast();
* int param_5 = obj.getFront();
* int param_6 = obj.getRear();
* boolean param_7 = obj.isEmpty();
* boolean param_8 = obj.isFull();
*/
결과
설명
- 지난 번 Design Circular Queue와 유사하게 아래의 구조의 순환되는 Deque를 구현하는 문제이다.
- 생성자인 MyCircularDeque(int k)는 Deque 크기인 k를 이용하여 객체를 초기화한다.
- 메서드인 insertFront()는 Deque의 앞에 입력된 값을 넣어주는 역할을 수행하며, 성공했는지 결과를 boolean 값으로 반환한다.
- 메서드인 insertLast()는 Deque의 뒤에 입력된 값을 넣어주는 역할을 수행하며, 성공했는지 결과를 boolean 값으로 반환한다.
- 메서드인 deleteFront()는 Deque의 앞에 입력된 값을 제거하는 역할을 수행하며, 성공했는지 결과를 boolean 값으로 반환한다.
- 메서드인 deleteLast()는 Deque의 뒤에 입력된 값을 제거하는 역할을 수행하며, 성공했는지 결과를 boolean 값으로 반환한다.
- 메서드인 getFront()는 Deque의 앞에 있는 값을 반환하는 역할을 수행하며, 비어있으면 -1을 반환한다.
- 메서드인 getRear()는 Deque의 뒤에 있는 값을 반환하는 역할을 수행하며, 비어있으면 -1을 반환한다.
- 메서드인 isEmpty()는 Deque가 비어있는지 검증하는 역할을 수행한다.
- 메서드인 isFull()은 Deque가 꽉 차있는지 검증하는 역할을 수행한다.
- 문제 풀이에 필요한 변수를 정의한다.
- deque는 입력된 값들을 순환되는 Deque로 관리하기 위한 배열이다.
- front와 rear는 입력된 값 중 가장 앞과 뒤에 입력된 값을 저장하는 변수이다.
- max는 deque의 최대 크기를 저장할 변수이다.
- size는 deque의 현재 크기를 저장할 변수이다.
- 생성자인 MyCircularDeque(int k)를 정의한다.
- deque를 입력된 k 크기인 정수 배열로 초기화한다.
- max에 k를 넣어 보관한다.
- rear는 초기 값인 1을 넣어 초기화한다.
- 메서드인 insertFront()를 정의한다.
- 11번에서 정의한 isFull() 메서드를 수행하여 deque가 꽉 차있는 경우 입력이 불가능하므로, false를 반환한다.
- 위의 경우가 아니라면 아래를 수행한다.
- front에 overflow를 방지하기 위해 $front + 1$에서 max를 나눈 나머지 값을 넣어준다.
- deque의 front번째 위치에 value를 넣어주고, size를 증가시킨다.
- 정상적으로 value를 deque의 앞에 저장하였으므로, true를 반환한다.
- 메서드인 insertLast()를 정의한다.
- 11번에서 정의한 isFull() 메서드를 수행하여 deque가 꽉 차있는 경우 입력이 불가능하므로, false를 반환한다.
- 위의 경우가 아니라면 아래를 수행한다.
- rear에 overflow를 방지하기 위해 $(rear - 1) + max$에서 max를 나눈 나머지 값을 넣어준다.
- deque의 rear번째 위치에 value를 넣어주고, size를 증가시킨다.
- 정상적으로 value를 deque의 뒤에 저장하였으므로, true를 반환한다.
- 메서드인 deleteFront()를 정의한다.
- 10번에서 정의한 isEmpty() 메서드를 수행하여 deque가 비어있는 경우 값이 없으므로, false를 반환한다.
- 위의 경우가 아니라면 아래를 수행한다.
- front에 overflow를 방지하기 위해 $(front - 1) + max$에 max를 나눈 나머지 값을 넣어준다.
- size를 감소시켜 현재 크기를 감소시킨다.
- 정상적으로 deque의 앞의 값을 제거하였으므로, true를 반환한다.
- 메서드인 deleteLast()를 정의한다.
- 10번에서 정의한 isEmpty() 메서드를 수행하여 deque가 비어있는 경우 값이 없으므로, false를 반환한다.
- 위의 경우가 아니라면 아래를 수행한다.
- rear에 overflow를 방지하기 위해 $rear + 1$에 max를 나눈 나머지 값을 넣어준다.
- size를 감소시켜 현재 크기를 감소시킨다.
- 정상적으로 deque의 뒤의 값을 제거하였으므로, true를 반환한다.
- 메서드인 getFront()를 정의한다.
- 10번에서 정의한 isEmpty() 메서드를 수행하여 deque가 비어있는 경우 값이 없으므로, -1을 반환한다.
- 위의 경우가 아니라면 deque의 front번째 값을 반환한다.
- 메서드인 getRear()를 정의한다.
- 10번에서 정의한 isEmpty() 메서드를 수행하여 deque가 비어있는 경우 값이 없으므로, -1을 반환한다.
- 위의 경우가 아니라면 deque의 rear번째 값을 반환한다.
- 메서드인 isEmpty()를 정의한다.
- size가 0인지를 검증한 결과를 반환한다.
- 메서드인 isFull()를 정의한다.
- size가 max인지를 검증한 결과를 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기