package collection.array;
import java.util.Arrays;
/**
* ArrayList
* 순서 있음
* 중복 허용
* 크기 동적
*/
public class MyArrayList<E> {
private static final int DEFAULT_CAPACITY = 5;
private Object[] objectData;// 동적으로 사이즈 변함
private int size = 0;
public MyArrayList() {
this.objectData = new Object[DEFAULT_CAPACITY];
}
public MyArrayList(int initialCapacity) {
this.objectData = new Object[initialCapacity];
}
public int size() {
return size;
}
public void add(E e) {
if (size == objectData.length) {
grow();
}
// 증가시키고 다시 원래대로 추가
objectData[size] = e;
size++;
}
// 특정 위치 추가
public void add(int index, E e) {
if (size == objectData.length) {
grow();
}
// 인덱스 기준으로 오른쪽 데이터가 -> 오른쪽으로 이동
shiftRightFrom(index);
objectData[index] = e;
size++;
}
// 인덱스 기준으로 오른쪽 데이터가 -> 오른쪽으로 이동
private void shiftRightFrom(int index) {
// 배열의 마지막에서부터 인덱스까지 오른쪽으로 밀기(마지막 배열 값은 사라진다)
for (int i = size; i > index; i--) {
objectData[i] = objectData[i - 1];
}
}
public E remove(int index) {
E oldVaule = get(index);
// 인덱스 기준으로 오른쪽 데이터가 -> 왼쪽으로 이동
shiftLeftFrom(index);
size--;
objectData[size] = null;// 마지막 지우기
return oldVaule;
}
// 인덱스 기준으로 오른쪽 데이터가 -> 왼쪽으로 이동
private void shiftLeftFrom(int index) {
for (int i = index; i < size - 1; i++) {
objectData[i] = objectData[i + 1];
}
}
private void grow() {
int oldCapacity = objectData.length;
int newCapacity = oldCapacity * 2;
objectData = Arrays.copyOf(objectData, newCapacity);// 대체 해버림
}
public E get(int index) {
return (E) objectData[index];
}
public E set(int index, E element) {
E oldValue = get(index);
objectData[index] = element;
return oldValue;
}
public int indexOf(E o) {
for (int i = 0; i < size; i++) {
if (o.equals(objectData[i])) {
return i;
}
}// for end
return -1;
}
@Override
public String toString() {
return Arrays.toString(Arrays.copyOf(objectData, size)) + " size=" + size + ", capacity=" + objectData.length;
}
}
privateObject[] elementData; privateintsize=0;
int size() grow()
add(E e) add(int index, E e)
E get(int index) E set(int index, E element) E remove(int index) shiftRightFrom(int index) shiftLeftFrom(int index) int indexOf(E o)
- linked list
Node 등장
private static class Node<E> {
E item;
Node<E> next;
public Node(E item) {
this.item = item;
}
}
class ArrayStack {
private int[] stack;
private int top;
private int capacity;
public ArrayStack(int capacity) {
this.capacity = capacity;
stack = new int[capacity];
top = -1;
}
// 요소 추가
public void push(int value) {
if (top == capacity - 1) {
throw new StackOverflowError("Stack is full");
}
stack[++top] = value;
}
// 요소 제거
public int pop() {
if (isEmpty()) {
throw new IllegalStateException("Stack is empty");
}
return stack[top--];
}
// 맨 위 요소 확인
public int peek() {
if (isEmpty()) {
throw new IllegalStateException("Stack is empty");
}
return stack[top];
}
// 스택이 비었는지 확인
public boolean isEmpty() {
return top == -1;
}
}
public class StackExample {
public static void main(String[] args) {
ArrayStack stack = new ArrayStack(5);
stack.push(10);
stack.push(20);
stack.push(30);
System.out.println("Top element: " + sta
- LinkedList 구현
class LinkedListStack {
private LinkedList<Integer> stack;
}
import java.util.LinkedList;
class LinkedListStack {
private LinkedList<Integer> stack;
public LinkedListStack() {
stack = new LinkedList<>();
}
// 요소 추가
public void push(int value) {
stack.addFirst(value); // 맨 앞에 추가
}
// 요소 제거
public int pop() {
if (isEmpty()) {
throw new IllegalStateException("Stack is empty");
}
return stack.removeFirst();
}
// 맨 위 요소 확인
public int peek() {
if (isEmpty()) {
throw new IllegalStateException("Stack is empty");
}
return stack.getFirst();
}
// 스택이 비었는지 확인
public boolean isEmpty() {
return stack.isEmpty();
}
}
public class StackExample {
public static void main(String[] args) {
LinkedListStack stack = new LinkedListStack();
stack.push(10);
stack.push(20);
stack.push(30);
System.out.println("Top element: " + stack.peek()); // 출력: 30
System.out.println("Popped element: " + stack.pop()); // 출력: 30
System.out.println("Popped element: " + stack.pop()); // 출력: 20
System.out.println("Is stack empty? " + stack.isEmpty()); // 출력: false
}
}
import java.util.*;
class Graph {
private Map<Integer, List<Integer>> adjacencyList;
public Graph() {
this.adjacencyList = new HashMap<>();
}
// 노드 추가
public void addNode(int node) {
adjacencyList.putIfAbsent(node, new ArrayList<>());
}
// 간선 추가
public void addEdge(int from, int to) {
adjacencyList.get(from).add(to); // 방향 그래프
// adjacencyList.get(to).add(from); // 무방향 그래프일 경우
}
// 그래프 출력
public void printGraph() {
for (var entry : adjacencyList.entrySet()) {
System.out.println(entry.getKey() + " -> " + entry.getValue());
}
}
// BFS (너비 우선 탐색)
public void bfs(int startNode) {
Queue<Integer> queue = new LinkedList<>();
Set<Integer> visited = new HashSet<>();
queue.add(startNode);
visited.add(startNode);
while (!queue.isEmpty()) {
int node = queue.poll();
System.out.print(node + " ");
for (int neighbor : adjacencyList.get(node)) {
if (!visited.contains(neighbor)) {
queue.add(neighbor);
visited.add(neighbor);
}
}
}
System.out.println();
}
}
public class GraphExample {
public static void main(String[] args) {
Graph graph = new Graph();
// 노드 추가
graph.addNode(1);
graph.addNode(2);
graph.addNode(3);
graph.addNode(4);
graph.addNode(5);
// 간선 추가
graph.addEdge(1, 2);
graph.addEdge(1, 3);
graph.addEdge(2, 4);
graph.addEdge(3, 5);
System.out.println("Graph Representation:");
graph.printGraph();
System.out.print("BFS Traversal starting from node 1: ");
graph.bfs(1); // 출력: 1 2 3 4 5
}
}
- directed graph
- undirected graph
- weight graph
set
* 유일성(중복X)
* 순서 미보장
* 인덱스 X
* 빠른 검색
ex) 회원 ID, 집합
- HashSet(순서 X),
- LinkedHashSet(순서 O)
- TreeSet(정렬 O)
Tree: 부모 Node, 자식 Node
package collection.set;
/**
* 유일성(중복X)
* 순서 미보장
* 인덱스 X
* 빠른 검색
* <p>
* ex) 회원 ID, 집합
* <p>
* HashSet(순서 X), LinkedHashSet(순서 O)
* TreeSet(정렬 O)
* <p>
* Tree:
* 부모 Node, 자식 Node
*/
public interface MySet<E> {
// 인덱스가 없어서 기능이 단순
boolean add(E element);
boolean remove(E value);
boolean contains(E value);
}
- hash set
set은 추가할 때마다 값이 유일한지 O(N) 탐색해야 함
따라서 Hash를 적용해서 탐색을 개선한 것이 hash set
Hash는 index를 사용한다
hashTable LinkedList안에 LinkedList 생성 * [[], [], [], [], ...]
public class MyHashSetV2 {
static final int DEFAULT_INITIAL_CAPACITY = 16;
LinkedList<Object>[] buckets;
private int size = 0;
private int capacity = DEFAULT_INITIAL_CAPACITY;
// 기본 생성자
public MyHashSetV2() {
initBuckets();
}
public MyHashSetV2(int capacity) {
this.capacity = capacity;
initBuckets();
}
private void initBuckets() {
buckets = new LinkedList[capacity];// 생성
// 이중 배열
for (int i = 0; i < capacity; i++) {
buckets[i] = new LinkedList<>();
}
}
}