๐Ÿ’ป Language/Java : ์ž๋ฐ”

[Java] ์ž๋ฃŒ๊ตฌ์กฐ - ๋ฐฐ์—ด, ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ, ์Šคํƒ, ํ, ํž™, ํŠธ๋ฆฌ, ๊ทธ๋ž˜ํ”„, ํ•ด์‹œ

mxnxeonx 2024. 11. 12. 20:25
728x90
728x90

1. ์ž๋ฃŒ๊ตฌ์กฐ

1) ์ž๋ฃŒ๊ตฌ์กฐ์˜ ์ •์˜

  • ์ž๋ฃŒ๊ตฌ์กฐ(Data Structure)๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜์—ฌ ํ•„์š”ํ•œ ์ž‘์—…์„ ๋น ๋ฅด๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ตฌ์กฐ
  • ๋ฐ์ดํ„ฐ์˜ ์กฐ์ž‘, ์ ‘๊ทผ ๋ฐฉ์‹์„ ์„ค๊ณ„ํ•˜๋Š” ์ค‘์š”ํ•œ ๊ฐœ๋…์œผ๋กœ ๋ฐ์ดํ„ฐ์˜ ์„ฑ๊ฒฉ๊ณผ ์‚ฌ์šฉ ๋ชฉ์ ์— ๋”ฐ๋ผ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ๋กœ ๊ตฌํ˜„
    • 'ํšจ์œจ์ ์ด๋‹ค' : ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์‹œ๊ฐ„๊ณผ ๊ณต๊ฐ„์„ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ
๋”๋ณด๊ธฐ

์ž๋ฃŒ์˜ ํ˜•ํƒœ์— ๋”ฐ๋ผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๋‹จ์ˆœ ๊ตฌ์กฐ : ๊ธฐ๋ณธ ์ž๋ฃŒํ˜• ์ •์ˆ˜, ์‹ค์ˆ˜, ๋ฌธ์ž, ๋ฌธ์ž์—ด ๋“ฑ
  • ์„ ํ˜• ๊ตฌ์กฐ : ์ž๋ฃŒ๋“ค ๊ฐ„์˜ ์•ž๋’ค ๊ด€๊ณ„๊ฐ€ 1:1์˜ ์„ ํ˜• ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๋Š” ์ž๋ฃŒํ˜• ๋ฆฌ์ŠคํŠธ, ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ, ์Šคํƒ, ํ, ๋ฐํฌ ๋“ฑ
  • ๋น„์„ ํ˜• ๊ตฌ์กฐ : ์ž๋ฃŒ๋“ค ๊ฐ„์˜ ์•ž๋’ค ๊ด€๊ณ„๊ฐ€ 1:๋‹ค, ๋‹ค:๋‹ค์˜ ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๋Š” ์ž๋ฃŒํ˜• ํŠธ๋ฆฌ, ๊ทธ๋ž˜ํ”„ ๋“ฑ
  • ํŒŒ์ผ ๊ตฌ์กฐ : ๋ ˆ์ฝ”๋“œ์˜ ์ง‘ํ•ฉ์ธ ํŒŒ์ผ์— ๋Œ€ํ•œ ๊ตฌ์กฐ ์ˆœ์ฐจํŒŒ์ผ, ์ƒ‰์ธํŒŒ์ผ, ์ง์ ‘ํŒŒ์ผ ๋“ฑ

 

2) ์ž๋ฃŒ๊ตฌ์กฐ์˜ ์ข…๋ฅ˜

(1) ๋ฐฐ์—ด (Array)

  • ๊ณ ์ •๋œ ํฌ๊ธฐ์˜ ์—ฐ์†์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ๊ฐ™์€ ์œ ํ˜•์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ
  • ๊ฐ ์š”์†Œ๋Š” ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๋Š” ์†๋„๊ฐ€ ๋น ๋ฆ„
  • ํฌ๊ธฐ๊ฐ€ ๊ณ ์ •๋˜์–ด ์žˆ์–ด ํฌ๊ธฐ๋ฅผ ๋™์ ์œผ๋กœ ์กฐ์ •ํ•˜๊ธฐ ์–ด๋ ค์›€
    • ๋ฌผ๋ฆฌ์  ์—ฐ์†์„ฑ, ์ •์  ๊ตฌ์กฐ, ์™ธ๋ถ€๋‹จํŽธํ™”O, ๊ฒ€์ƒ‰ ์—ฐ์‚ฐโ–ฒ, ๊ธฐ๋ก ๋ฐ€๋„โ–ผ, ์ˆ˜์ • ์—ฐ์‚ฐโ–ฒ, ์‚ฝ์ž…/์‚ญ์ œ ์—ฐ์‚ฐโ–ผ
public class ArrayExample {
    public static void main(String[] args) {
        int[] array = new int[5]; // ๋ฐฐ์—ด ํฌ๊ธฐ 5
        array[0] = 10;
        array[1] = 20;
        array[2] = 30;
        
        // ๋ฐฐ์—ด ์š”์†Œ ์ถœ๋ ฅ
        for (int i = 0; i < array.length; i++) {
            System.out.println(array[i]);
        }
    }
}

(2) ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ (Linked List)

  • ์š”์†Œ๋“ค์ด ๊ฐ๊ฐ ๋…ธ๋“œ(node)๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, ๊ฐ ๋…ธ๋“œ๋Š” ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๋ฅผ ํ†ตํ•ด ์„œ๋กœ ์—ฐ๊ฒฐ๋œ ์ž๋ฃŒ๊ตฌ์กฐ
  • ์‚ฝ์ž…๊ณผ ์‚ญ์ œ๊ฐ€ ์šฉ์ดํ•˜๋ฉฐ, ๋ฐฐ์—ด๊ณผ ๋‹ฌ๋ฆฌ ๊ฐ ์š”์†Œ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์˜ ์ž„์˜์˜ ์œ„์น˜์— ์ €์žฅ๋˜๊ณ , ํฌ๊ธฐ๋ฅผ ์œ ๋™์ ์œผ๋กœ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ์Œ
  • ํŠน์ • ์š”์†Œ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ์ˆœ์ฐจ์ ์œผ๋กœ ํƒ์ƒ‰ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๊ฒ€์ƒ‰ ์†๋„๊ฐ€ ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Œ
    • ๋…ผ๋ฆฌ์  ์—ฐ์†์„ฑ, ๋™์  ๊ตฌ์กฐ, ์™ธ๋ถ€๋‹จํŽธํ™”X, ๊ฒ€์ƒ‰ ์—ฐ์‚ฐโ–ผ, ๊ธฐ๋ก ๋ฐ€๋„โ–ผ, ์ˆ˜์ • ์—ฐ์‚ฐโ–ฒ, ์‚ฝ์ž…/์‚ญ์ œ ์—ฐ์‚ฐโ–ผ
class Node {
    int data;
    Node next;
    
    public Node(int data) {
        this.data = data;
        this.next = null;
    }
}

class LinkedList {
    Node head;
    
    public void add(int data) {
        Node newNode = new Node(data);
        if (head == null) {
            head = newNode;
        } else {
            Node current = head;
            while (current.next != null) {
                current = current.next;
            }
            current.next = newNode;
        }
    }
    
    public void printList() {
        Node current = head;
        while (current != null) {
            System.out.print(current.data + " ");
            current = current.next;
        }
        System.out.println();
    }
}

public class LinkedListExample {
    public static void main(String[] args) {
        LinkedList list = new LinkedList();
        list.add(10);
        list.add(20);
        list.add(30);
        list.printList();
    }
}

(3) ์Šคํƒ (Stack)

  • ํ›„์ž…์„ ์ถœ(LIFO; Last In, First Out) ๋ฐฉ์‹์˜ ์ž๋ฃŒ๊ตฌ์กฐ
  • ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ์ถ”๊ฐ€๋œ ์š”์†Œ๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € ์ œ๊ฑฐ๋จ, ์š”์†Œ๋ฅผ ์ถ”๊ฐ€(push)ํ•˜๊ณ  ์ œ๊ฑฐ(pop)ํ•˜๋Š” ์—ฐ์‚ฐ๋งŒ ๊ฐ€๋Šฅ
  • ํ•จ์ˆ˜ ํ˜ธ์ถœ์˜ ๊ด€๋ฆฌ, ์‹คํ–‰ ์ทจ์†Œ(undo), ๊ด„ํ˜ธ ๊ฒ€์‚ฌ, ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ• ๋“ฑ์— ์ด์šฉ
import java.util.EmptyStackException;

class Stack {
    private int[] stack;
    private int top;
    
    public Stack(int size) {
        stack = new int[size];
        top = -1;
    }
    
    public void push(int value) {
        if (top == stack.length - 1) {
            System.out.println("Stack is full");
            return;
        }
        stack[++top] = value;
    }
    
    public int pop() {
        if (top == -1) {
            throw new EmptyStackException();
        }
        return stack[top--];
    }
    
    public int peek() {
        if (top == -1) {
            throw new EmptyStackException();
        }
        return stack[top];
    }
}

public class StackExample {
    public static void main(String[] args) {
        Stack stack = new Stack(5);
        stack.push(10);
        stack.push(20);
        System.out.println(stack.pop()); // 20
        System.out.println(stack.peek()); // 10
    }
}

(4) ํ (Queue)

  • ์„ ์ž…์„ ์ถœ(FIFO; First In First Out) ๋ฐฉ์‹์˜ ์ž๋ฃŒ๊ตฌ์กฐ
  • ๊ฐ€์žฅ ๋จผ์ € ๋“ค์–ด์˜จ ์š”์†Œ๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € ์ œ๊ฑฐ๋จ. ๋ฐ์ดํ„ฐ ๋„ฃ๊ธฐ(enqueue), ๊บผ๋‚ด๊ธฐ(dequeue)
  • ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰, ๋Œ€๊ธฐ์—ด ๊ด€๋ฆฌ, ์ž‘์—…(CPU) ์Šค์ผ€์ค„๋ง, ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆฌ๋ฐ ๋“ฑ์— ์ด์šฉ
class Queue {
    private int[] queue;
    private int front;
    private int rear;
    private int size;
    
    public Queue(int size) {
        queue = new int[size];
        front = -1;
        rear = -1;
        this.size = size;
    }
    
    public void enqueue(int value) {
        if (rear == size - 1) {
            System.out.println("Queue is full");
            return;
        }
        queue[++rear] = value;
        if (front == -1) front = 0;
    }
    
    public int dequeue() {
        if (front == -1 || front > rear) {
            System.out.println("Queue is empty");
            return -1;
        }
        return queue[front++];
    }
}

public class QueueExample {
    public static void main(String[] args) {
        Queue queue = new Queue(5);
        queue.enqueue(10);
        queue.enqueue(20);
        System.out.println(queue.dequeue()); // 10
        System.out.println(queue.dequeue()); // 20
    }
}

(5) ํž™ (Queue)

  • ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ ํ˜•ํƒœ์˜ ์ž๋ฃŒ ๊ตฌ์กฐ๋กœ, ์šฐ์„ ์ˆœ์œ„ ํ(Priority Queue)๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋จ
// ์ตœ์†Œ ํž™ ์˜ˆ์ œ

import java.util.PriorityQueue;

public class HeapExample {
    public static void main(String[] args) {
        PriorityQueue<Integer> minHeap = new PriorityQueue<>();
        minHeap.add(20);
        minHeap.add(10);
        minHeap.add(30);
        
        System.out.println(minHeap.poll()); // 10
        System.out.println(minHeap.poll()); // 20
    }
}

(6) ๊ทธ๋ž˜ํ”„ (Graph)

  • ๊ฐ์ฒด(๋…ธ๋“œ ๋˜๋Š” ์ •์ )์™€ ๊ฐ์ฒด ๊ฐ„์˜ ๊ด€๊ณ„(์—ฃ์ง€ ๋˜๋Š” ๊ฐ„์„ )๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋น„์„ ํ˜• ์ž๋ฃŒ๊ตฌ์กฐ
  • ์ˆœํ™˜์ ์ธ ๊ตฌ์กฐ(์‚ฌ์ดํด ํ—ˆ์šฉ)๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ณ , ๋ฐฉํ–ฅ์„ ๊ฐ€์งˆ ์ˆ˜๋„ ์žˆ์Œ
  • ์‚ฌํšŒ/๋„๋กœ ๋„คํŠธ์›Œํฌ, ์›น ํŽ˜์ด์ง€์˜ ๋งํฌ ๊ตฌ์กฐ, ์†Œ์…œ ๋ฏธ๋””์–ด, ์ง€๋„ ํƒ์ƒ‰ ๋“ฑ ๋ณต์žกํ•œ ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•  ๋•Œ ์œ ์šฉ
// ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•œ ๊ทธ๋ž˜ํ”„ ๊ตฌํ˜„

import java.util.ArrayList;
import java.util.List;

class Graph {
    private List<List<Integer>> adjList;
    
    public Graph(int vertices) {
        adjList = new ArrayList<>(vertices);
        for (int i = 0; i < vertices; i++) {
            adjList.add(new ArrayList<>());
        }
    }
    
    public void addEdge(int src, int dest) {
        adjList.get(src).add(dest);
        adjList.get(dest).add(src); // ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„
    }
    
    public void printGraph() {
        for (int i = 0; i < adjList.size(); i++) {
            System.out.print("Vertex " + i + ":");
            for (int edge : adjList.get(i)) {
                System.out.print(" -> " + edge);
            }
            System.out.println();
        }
    }
}

public class GraphExample {
    public static void main(String[] args) {
        Graph graph = new Graph(3);
        graph.addEdge(0, 1);
        graph.addEdge(1, 2);
        graph.addEdge(2, 0);
        
        graph.printGraph();
    }
}

(7) ํŠธ๋ฆฌ (Tree)

  • ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋น„์„ ํ˜• ์ž๋ฃŒ๊ตฌ์กฐ๋กœ, ๊ฐ ๋…ธ๋“œ๊ฐ€ ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Œ
  • ๋ฃจํŠธ(root) ๋…ธ๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฐ ๋…ธ๋“œ๊ฐ€ ์ž์‹์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•œ ๊ฐœ์˜ ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง(๋ฃจํŠธ ๋…ธ๋“œ ์ œ์™ธ)
  • ๋ฐ์ดํ„ฐ์˜ ๊ณ„์ธต์  ๊ตฌ์กฐ๋ฅผ ํ‘œํ˜„ํ•˜๊ณ  ๊ฒ€์ƒ‰/์‚ฝ์ž…/์‚ญ์ œ ์—ฐ์‚ฐ์„ ํšจ์œจ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ
  • ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ, AVL ํŠธ๋ฆฌ, B-ํŠธ๋ฆฌ, ๋ ˆ๋“œ-๋ธ”๋ž™ ํŠธ๋ฆฌ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ณ€ํ˜•์ด ์กด์žฌ
  • ๊ทธ๋ž˜ํ”„์˜ ํŠน์ˆ˜ํ•œ ํ˜•ํƒœ๋กœ ์‚ฌ์ดํด์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ํŒŒ์ผ ์‹œ์Šคํ…œ, HTML ๋ฌธ์„œ์˜ DOM, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ ๋“ฑ์— ์‚ฌ์šฉ
// ์ด์ง„ ํŠธ๋ฆฌ

class TreeNode {
    int data;
    TreeNode left, right;
    
    public TreeNode(int data) {
        this.data = data;
        left = right = null;
    }
}

class BinaryTree {
    TreeNode root;
    
    public void preorder(TreeNode node) {
        if (node != null) {
            System.out.print(node.data + " ");
            preorder(node.left);
            preorder(node.right);
        }
    }
}

public class TreeExample {
    public static void main(String[] args) {
        BinaryTree tree = new BinaryTree();
        tree.root = new TreeNode(10);
        tree.root.left = new TreeNode(20);
        tree.root.right = new TreeNode(30);
        
        tree.preorder(tree.root); // 10 20 30
    }
}

(8) ํ•ด์‹œ (Hash)

  • ํ‚ค(Key)๋ฅผ ์ž…๋ ฅ ๋ฐ›์•„ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๊ฐ’์„ ๋น ๋ฅด๊ฒŒ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ
  • ํ‚ค๋ฅผ ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ์ธ๋ฑ์Šค๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์ฐพ์Œ
  • ์ถฉ๋Œ(collision) ํ•ด๊ฒฐ ๊ธฐ๋ฒ• : ํ•ด์‹œ ํ•จ์ˆ˜์˜ ์ถœ๋ ฅ์ด ๊ฐ™์•„(๊ฐ™์€ ํ•ด์‹œ ๊ฐ’) ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ
    • ๊ฐœ๋ณ„ ์ฒด์ด๋‹, ๊ฐœ๋ฐฉ ์ฃผ์†Œ๋ฒ•, ์ด์ฐจ ํ•ด์‹œ, ํ•ด์‹ฑ ํ›„์ฒด์ด๋‹ ๋“ฑ
  • ํ•ด์‹œ ๋งต(hash map) ๋˜๋Š” ๋”•์…”๋„ˆ๋ฆฌ(dictionary)๋กœ ๊ตฌํ˜„
    • ํ•ด์‹œ ๋งต : ํ‚ค-๊ฐ’ ์Œ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ. ๊ฐ ํ‚ค๋Š” ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๊ณ ์œ ์˜ ์ธ๋ฑ์Šค๋กœ ๋งคํ•‘๋˜์–ด ๋น ๋ฅด๊ฒŒ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ (Java์˜ HashMap)
    • ๋”•์…”๋„ˆ๋ฆฌ : ํ‚ค-๊ฐ’ ์Œ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ  ๋‚ด๋ถ€์ ์œผ๋กœ ํ•ด์‹œ ํ…Œ์ด๋ธ”๋กœ ๊ตฌํ˜„๋จ (Python์˜ dict)
  • ๋ฐ์ดํ„ฐ์˜ ๋น ๋ฅธ ๊ฒ€์ƒ‰๊ณผ ์‚ฝ์ž…์— ๋งค์šฐ ํšจ์œจ์ 
import java.util.HashMap;

public class HashMapExample {
    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<>();
        map.put("Alice", 30);
        map.put("Bob", 25);
        
        System.out.println(map.get("Alice")); // 30
        System.out.println(map.containsKey("Bob")); // true
        System.out.println(map.remove("Alice")); // 30
    }
}
728x90
320x100