2025.04.03,
복잡도에 따른 표기법
로직이 실행되는데 입력 값에 걸리는 시간

public static int binarySearch(int[] arr, int target){
<!-- 초기 세팅 배열 오름차순 -->
Arrays.sort(arr);
<!-- 배열의 처음과 끝을 지정하는 인덱스 번호 변수 -->
int left = 0, right = arr.length -1;
while (left <= right){
int mid = left + (right - left) / 2;
<!-- 타겟과 mid 값이 일치하는 경우
if (target == arr[mid]){
return mid;
<!-- 타겟보다 mid 값이 작으면 현재 mid의 하나 큰 값으로 이동한다. -->
} else if (arr[mid] < target) {
left = mid + 1;
<!-- 타겟보다 mid 값이 크면 현재 mid의 하나 작은 값으로 이동한다. -->
} else {
right = mid -1;
}
}
return -1;
}
public static int[] reverse(int[] arr){
int[] reversed = new int[arr.length];
for (int i = 0; i < arr.length; i++){
reversed[i] = arr[arr.length -1 -i];
}
return reversed;
}
public static int fibonacci(int n){
<!-- n 이 0 또는 1인 경우 -->
if(n<=1){
return n;
}
return fibonacci(n-1) + fibonacci(n-2);
}
로직 연산에 사용되는 메모리 공간으로 총 공간 요구 = 고정 공간 요구 + 가변 공간 요구
순서가 있는 데이터의 집합

List<Integer> list = new ArrayList<>();
<!-- 요소 추가 -->
list.add(E e); // 리스트 끝에 요소 추가
list.add(int index, E e); // 특정 위치에 요소 삽입
<!-- 요소 조회 -->
list.get(int index); // 해당 인덱스의 요소 반환
<!-- 요소 제거 -->
list.remove(int index); // 해당 인덱스 요소 제거 및 뒤 요소 이동
<!-- 리스트 크기 -->
list.size(); // 현재 요소 개수 반환
<!-- 요소 여부 확인 -->
list.isEmpty(); // 요소가 비어 있는지 확인
<!-- 초기화 -->
list.clear(); // 리스트 전체 비우기

List<Integer> list2 = new LinkedList<>();
<!-- 요소 추가 -->
list2.add(E e); // 리스트 끝에 요소 추가
list2.add(int index, E e); // 특정 위치에 요소 삽입
<!-- 요소 조회 -->
list2.get(int index); // 해당 인덱스의 요소 반환
<!-- 요소 제거 -->
list2.remove(int index); // 해당 인덱스 요소 제거 및 뒤 요소 이동
<!-- 리스트 크기 -->
list2.size(); // 현재 요소 개수 반환
<!-- 요소 여부 확인 -->
list2.isEmpty(); // 요소가 비어 있는지 확인
<!-- 초기화 -->
list2.clear(); // 리스트 전체 비우기
LIFO(Last In, First Out) 방식으로 데이터를 관리하는 자료구조
Stack<Integer> stack = new Stack<>();
<!-- 요소 추가 -->
stack.push(E e);
<!-- 요소 조회 -->
stack.peek(); //스택의 맨 위 데이터를 제거하지 않고 반환
<!-- 요소 제거 -->
stack.pop(); // 스택의 맨 위 데이터를 제거하고 반환
<!-- 스택 비어있는지 확인 -->
stack.isEmpty();
<!-- 스택 크기 -->
stack.size();
<!-- 초기화 -->
stack.clear();

배열 기반으로 스택을 구현

연결 리스트 기반으로 스택을 구현
알고리즘 문제 풀이
-> 배열을 사용한다?
-> 첫 요소, 끝 요소, 중간 요소 변수를 미리 선언해 놓는다.
-> 스택을 사용한다?
-> 탑 요소를 어떻게 관리 할 것인가?
FIFO(First In, First Out) 방식으로 데이터를 관리하는 자료구조

자바 표준 라이브러리에는 존재하지 않기 때문에 직접 구현해야 한다

Queue<Integer> queue = new LinkedList<>();
<!-- 요소 추가 -->
queue.offer(E e); // 큐의 끝에 요소 추가 (성공 여부 반환)
<!-- 요소 조회 -->
queue.peek(); // 큐의 맨 앞 요소를 제거하지 않고 반환 (비어있으면 null)
<!-- 요소 제거 -->
queue.poll(); // 큐의 맨 앞 요소를 제거하고 반환 (비어있으면 null)
<!-- 큐 비어있는지 확인 -->
queue.isEmpty();
<!-- 큐 크기 -->
queue.size();
<!-- 초기화 -->
queue.clear();
양쪽 끝에서 삽입과 삭제를 허용하는 자료구조

순환 배열을 사용하여 양쪽 끝에서의 삽입과 삭제를 효율적으로 처리
Deque<Integer> deque = new ArrayDeque<>();
<!-- 요소 추가 -->
deque.addFront(E e); // 데이터 x를 덱의 앞쪽에 추가
deque.addRear(E e); // 데이터 x를 덱의 뒤쪽에 추가
<!-- 요소 조회 -->
deque.getFront(); // 덱의 앞쪽 데이터를 반환 (제거하지 않음)
deque.getRear(); // 덱의 뒤쪽 데이터를 반환 (제거하지 않음)
<!-- 요소 제거 -->
deque.deleteFront(); // 덱의 앞쪽에서 데이터를 제거
deque.deleteRear(); // 덱의 뒤쪽에서 데이터를 제거
<!-- 큐 비어있는지 확인 -->
deque.isEmpty();
<!-- 큐 크기 -->
deque.size();
<!-- 초기화 -->
deque.clear();



계층적인 구조로 노드와 자식 노드들로 구성된 자료구조
정점과 간선으로 연결된 그래프의 특수한 형태(그래프의 부분 집합)
각 노드가 최대 두 개의 자식을 가지는 트리 구조
노드들이 한쪽(왼쪽/오른쪽)으로만 연결
왼쪽과 오른쪽 서브트리의 높이 차이가 최소
트리의 높이가 모두 일정하며 리프 노드가 꽉찬 트리
마지막 레벨을 제외하고 노드들이 완전히 채워져 있고, 마지막 레벨은 왼쪽부터 채워진 트리
이진 트리의 구조를 가지면서 추가로 왼쪽 서브트리의 모든 노드는 현재 노드 값 보다 작고, 오른쪽 서브 트리의 모든 노드는 현재 노드 값보다 크다는 규칙(정렬 속성)을 만족
트리를 복사, 전위 표기법을 구하는데 주로 사용
public void preOrder(Node node) {
if(node != null) {
System.out.print(node.data + " ");
if(node.left != null) preOrder(node.left);
if(node.right != null) preOrder(node.right);
}
}
이진 탐색트리에서 오름차순/내림차순으로 값을 가져올 때 주로 사용
public void inOrder(Node node) {
if(node != null) {
if(node.left != null) inOrder(node.left);
System.out.print(node.data + " ");
if(node.right != null) inOrder(node.right);
}
}
트리를 삭제할 때 주로 사용
public void postOrder(Node node) {
if(node != null) {
if(node.left != null) postOrder(node.left);
if(node.right != null) postOrder(node.right);
System.out.print(node.data + " ");
}
}
균형 잡힌 이진 탐색 트리

중복 불허, 자동정렬(기본은 오름차순)
TreeSet<Integer> set = new TreeSet<>();
<!-- 삽입 -->
set.add(value);
<!-- 삭제 -->
set.remove(value);
<!-- 포함 여부 확인 -->
set.contains(value);
<!-- 비어있는지 확인 -->
set.isEmpty();
<!-- 요소 개수 확인 -->
set.size();
<!-- 초기화 -->
set.clear();

키를 기준으로 정렬되는 map
TreeMap<Integer, String> map = new TreeMap<>();
<!-- 삽입 -->
map.put(key, "value");
<!-- 삭제 -->
map.remove(key);
<!-- 키 존재 여부 확인 -->
map.containsKey(key);
<!-- 키에 해당하는 값 조회 -->
map.get(key);
<!-- 비어있는지 확인 -->
map.isEmpty();
<!-- 요소 개수 확인 -->
map.size();
<!-- 초기화 -->
map.clear();
완전 이진 트리 구조를 가지며, 우선순위 큐를 구현하기 위한 자료구조
PriorityQueue<Integer> heap = new PriorityQueue<>();
<!-- 요소 추가 -->
heap.offer(value);
<!-- 큐에서 가장 앞에 있는 값 조회 -->
<!-- PriorityQueue는 기본이 최소 힙, 작은 값이 먼저 나옴
숫자가 작을수록 우선순위가 높다 -->
heap.peek();
<!-- 삭제하면서 반환 -->
heap.poll();
<!-- 비어있는지 확인 -->
heap.isEmpty();
<!-- 요소 개수 확인 -->
heap.size();
<!-- 전체 초기화 -->
heap.clear();
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Collections.reverseOrder());
or
<!-- 사용자 정의 정렬기준
PriorityQueue<Integer> maxHeap = new PriorityQueue<>((a, b) -> b - a);
정점(node 또는 vertex)과 간선(edge)으로 이루어진 자료구조


2차원 배열을 사용하여 노드 간의 연결 관계를 표현
각 노드에 연결된 노드 목록을 리스트로 표현

인텔리제이 디버그 모드 단축키