Fullstack-Study

자료구조

1. 배열(Array)

1-1. 정적 배열 (static Array)

int[] arr = new int[5];
arr[0] = 10;

1-2. 동적 배열 (ArrayList)

ArrayList<Integer> list = new ArrayList<>();
list.add(10);
list.remove(10);

2. 연결 리스트(Linked List)

class Node { int val; Node next; Node(int val){ this.val=val; } }
Node head = new Node(10);
head.next = new Node(20);

3. 스택(Stack)

Stack<Character> stack = new Stack<>();
stack.push('(');
stack.pop();

4. 큐(Queue)

Queue<Integer> queue = new LinkedList<>();
queue.offer(1);
queue.poll();

5. 해시(Hash Table)

HashMap<String, Integer> map = new HashMap<>();
map.put("apple", 3);
map.get("apple");

6. 트리(Tree)

6-1. 이진 탐색 트리(BST, Binary Search Tree)

6-2. 힙(Heap)

PriorityQueue<Integer> minHeap = new PriorityQueue<>();
minHeap.add(10);
minHeap.poll();

6-3. 트라이(Trie)


7. 그래프(Graph)

Queue<Integer> q = new LinkedList<>();
boolean[] visited = new boolean[n];

알고리즘

1. 정렬(Sorting)

1-1. 선택 정렬(Selection Sort)

for(int i=0;i<n-1;i++){
   int min=i;
   for(int j=i+1;j<n;j++)
       if(arr[j]<arr[min]) min=j;
   int tmp=arr[i]; arr[i]=arr[min]; arr[min]=tmp;
}

1-2. 버블 정렬(Bubble Sort)

for(int i=0;i<n-1;i++){
    for(int j=0;j<n-1-i;j++){
        if(arr[j] > arr[j+1]){
            int tmp = arr[j];
            arr[j] = arr[j+1];
            arr[j+1] = tmp;
        }
    }
}

1-3. 삽입 정렬(Insertion Sort)

for(int i=1;i<n;i++){
    int key = arr[i];
    int j = i - 1;
    while(j >= 0 && arr[j] > key){
        arr[j+1] = arr[j];
        j--;
    }
    arr[j+1] = key;
}

1-4. 퀵 정렬(Quick Sort)

void quickSort(int[] arr, int low, int high){
    if(low < high){
        int pi = partition(arr, low, high);
        quickSort(arr, low, pi - 1);
        quickSort(arr, pi + 1, high);
    }
}

int partition(int[] arr, int low, int high){
    int pivot = arr[high];
    int i = low - 1;
    for(int j=low;j<high;j++){
        if(arr[j] < pivot){
            i++;
            int tmp = arr[i]; arr[i]=arr[j]; arr[j]=tmp;
        }
    }
    int tmp = arr[i+1]; arr[i+1]=arr[high]; arr[high]=tmp;
    return i+1;
}

1-5. 병합 정렬(Merge Sort)

void mergeSort(int[] arr, int l, int r){
    if(l < r){
        int m = l + (r-l)/2;
        mergeSort(arr, l, m);
        mergeSort(arr, m+1, r);
        merge(arr, l, m, r);
    }
}

void merge(int[] arr, int l, int m, int r){
    int n1 = m-l+1, n2 = r-m;
    int[] L = new int[n1]; int[] R = new int[n2];
    for(int i=0;i<n1;i++) L[i] = arr[l+i];
    for(int j=0;j<n2;j++) R[j] = arr[m+1+j];

    int i=0,j=0,k=l;
    while(i<n1 && j<n2){
        if(L[i]<=R[j]) arr[k++] = L[i++];
        else arr[k++] = R[j++];
    }
    while(i<n1) arr[k++] = L[i++];
    while(j<n2) arr[k++] = R[j++];
}

1-6. 힙 정렬(Heap Sort)

void heapSort(int[] arr){
    int n = arr.length;
    // 힙 구성
    for(int i=n/2-1;i>=0;i--) heapify(arr,n,i);
    // 루트 제거 + heapify 반복
    for(int i=n-1;i>=0;i--){
        int tmp = arr[0]; arr[0]=arr[i]; arr[i]=tmp;
        heapify(arr,i,0);
    }
}

void heapify(int[] arr, int n, int i){
    int largest = i;
    int l = 2*i + 1;
    int r = 2*i + 2;

    if(l<n && arr[l]>arr[largest]) largest = l;
    if(r<n && arr[r]>arr[largest]) largest = r;

    if(largest != i){
        int tmp = arr[i]; arr[i]=arr[largest]; arr[largest]=tmp;
        heapify(arr,n,largest);
    }
}


3. 동적 프로그래밍(DP)

int[] dp = new int[n];
Arrays.fill(dp,1);
for(int i=1;i<n;i++)
    for(int j=0;j<i;j++)
        if(arr[i]>arr[j]) dp[i]=Math.max(dp[i], dp[j]+1);

4. 그리디(Greedy)ckdla

 int[] coins={500,100,50,10}; int change=760;
 for(int c: coins){ int cnt=change/c; change-=cnt*c; }

5. 백트래킹 / 분기 한정

void dfs(int row){
    for(int col=0;col<n;col++){
        if(isValid(row,col)){
            board[row][col]=1;
            dfs(row+1);
            board[row][col]=0;
        }
    }
}