Stack은 Last In First Out (LIFO) 원칙에 따라 데이터를 저장하고 처리합니다. 가장 최근에 추가된 데이터가 가장 먼저 처리되는 구조를 가지며, push() 메서드를 사용하여 데이터를 삽입하고 pop() 메서드를 사용하여 데이터를 제거합니다.
배열 arr에서 연속적으로 나타나는 숫자는 제거하고 남은 수들을 return 하는 solution 함수를 완성해 주세요.
public int[] solution(int[] arr) {
Stack<Integer> stack = new Stack<>();
for (int num : arr) {
if (stack.isEmpty() || stack.peek() != num) {
stack.push(num);
}
}
int[] resultArr = new int[stack.size()];
for (int i = stack.size() - 1; i >= 0; i--) {
resultArr[i] = stack.pop();
}
return resultArr;
}
Stack은 위와 같이 Java에서 Class로 정의되어 있습니다. (그 자체가 구현체입니다)
Queue는 First In First Out (FIFO) 원칙에 따라 데이터를 저장하고 처리합니다. 가장 먼저 추가된 데이터가 가장 먼저 처리되는 구조를 가지며, offer() 메서드를 사용하여 데이터를 삽입하고 poll() 메서드를 사용하여 데이터를 제거합니다.
public int[] solution(int[] progresses, int[] speeds) {
Queue<Integer> queue = new LinkedList<>();
int n = progresses.length;
for (int i = 0; i < n; i++) {
int days = (100 - progresses[i] + speeds[i] - 1) / speeds[i];
queue.offer(days);
}
List<Integer> answerList = new ArrayList<>();
while (!queue.isEmpty()) {
int cnt = 1;
int cur = queue.poll();
while (!queue.isEmpty() && queue.peek() <= cur) {
cnt++;
queue.poll();
}
answerList.add(cnt);
}
int[] answer = new int[answerList.size()];
for (int i = 0; i < answerList.size(); i++) {
answer[i] = answerList.get(i);
}
return answer;
}
Queue는 인터페이스입니다. 구현체(Class)로는 ArrayDeque, LinkedList 등이 있습니다.
Array는 데이터를 연속된 메모리 공간에 저장하는 자료구조입니다. 따라서 인덱스를 통해 빠르게 원하는 위치에 접근할 수 있습니다. 또한 데이터를 삽입하거나 삭제할 때는 해당 위치에서 이후의 모든 데이터를 이동시켜야 하므로 시간이 많이 소요됩니다.
LinkedList는 각각의 노드가 데이터와 다음 노드를 가리키는 포인터로 구성된 구조입니다. 따라서 삽입, 삭제 등의 작업은 해당 노드에서의 포인터만 변경하면 되므로 Array보다 효율적입니다.
둘다 컬렉션 프레임워크를 상속받으며, Array는 상속받는 인터페이스 없이 존재하는 Class, LinkedList는 List를 상속받습니다.
즉, LinkedList는 List이며 따라서 인덱스가 존재합니다.
LinkedList 클래스는 List 인터페이스를 구현하며, List 인터페이스는 순서가 있는 컬렉션을 정의합니다.
하지만, 인덱스를 사용하여 요소를 삽입하거나 삭제하는 것은 LinkedList 클래스의 주요 용도가 아니며, 이 작업은 다른 List 인터페이스를 구현한 클래스들보다 비효율적입니다.