전체 글 41

검색 (Search)

데이터 집합에서 특정 항목을 찾는 데 사용되는 방법 선형 탐색 (Linear Search): 데이터를 처음부터 끝까지 순차적으로 검색하는 방법이며 시간 복잡도는 O(n) public class LinearSearchTest { public static int linearSearch(int[] arr, int target) { for (int i = 0; i < arr.length; i++) { if (arr[i] == target) { return i; // 찾은 경우 해당 인덱스 반환 } } return -1; // 찾지 못한 경우 -1 반환 } public static void main(String[] args) { int[] arr = {4, 2, 8, 1, 7, 5}; int target = 7;..

learn/Algorithm 2023.09.25

정렬 (Sorting)

데이터를 특정한 순서로 정리하는 방법 선택 정렬 (Selection Sort): 가장 작은 값을 선택하여 맨 앞으로 이동시키는 방식으로 정렬 public class SelectionSortTest { public static void selectionSort(int[] arr) { int n = arr.length; for (int i = 0; i < n - 1; i++) { int minIndex = i; for (int j = i + 1; j < n; j++) { if (arr[j] < arr[minIndex]) { minIndex = j; } } int temp = arr[minIndex]; arr[minIndex] = arr[i]; arr[i] = temp; } } public static voi..

learn/Algorithm 2023.09.25

해쉬맵 (HashMap)과 해쉬테이블 (HashTable)

해쉬맵(HashMap) Java에서 제공하는 데이터 구조 중 하나로, 키(Key)와 값(Value)의 쌍을 저장하는 자료구조로 빠르게 데이터를 검색하고 저장할 수 있음 키와 값의 쌍: 각 요소를 키와 값의 쌍으로 저장하며 쌍은 서로 연결되어 있으며, 특정 키를 통해 해당 값에 빠르게 접근할 수 있음 중복 키 불가: 키는 중복되지 않고 동일한 키를 여러 번 추가할 수 없음 순서 보장하지 않음: 요소들의 순서를 보장하지 않고 데이터가 저장된 순서대로 접근할 수 없음 검색 및 삽입 시간 복잡도: HashMap은 해시 테이블을 사용하기 때문에 키를 기반으로 데이터를 검색하고 삽입하는 데 평균적으로 O(1)의 시간 복잡도를 가지지만 해시 충돌(Hash Collision)이 발생할 경우 시간 복잡도는 O(n)이 될..

파일 (File)

데이터를 저장하고 관리하는 방법 순차 파일(Sequential File) 순차 파일은 데이터 레코드가 논리적인 순서대로 연속적인 블록에 저장되는 파일 구조로 데이터를 읽거나 쓸 때 처음부터 순차적으로 접근해야 함 package datastructure.nonlinear; import java.io.*; public class SequentialFileTest { public static void main(String[] args) { try { // 파일 생성 또는 열기 FileWriter fw = new FileWriter("sequential_file.txt"); BufferedWriter bw = new BufferedWriter(fw); // 데이터 쓰기 bw.write("첫 번째 레코드"); b..

그래프 (Graph)

개체 간의 관계를 표현하는 자료 구조 무방향 그래프 (Undirected Graph) 간선(Edge)이 방향을 가지지 않는 그래프 간선은 두 노드 사이의 연결을 나타냅 package datastructure.nonlinear; import java.util.*; class UndirectedGraphTest { private int V; // 노드 수 private LinkedList adjacencyList[]; // 인접 리스트 UndirectedGraphTest(int v) { V = v; adjacencyList = new LinkedList[v]; for (int i = 0; i < v; ++i) adjacencyList[i] = new LinkedList(); } // 노드와 연결된 간선 추가..

트리 (Tree)

비선형 자료구조로, 계층적인 관계를 나타내는 데 사용 일반 트리(General Tree) 루트 노드에서 여러 개의 자식 노드를 가질 수 있는 트리 구조 각 노드는 부모와 자식 노드를 가리키는 포인터(링크) package datastructure.nonlinear; import java.util.ArrayList; import java.util.List; class TreeNode { int data; List children; TreeNode(int data) { this.data = data; children = new ArrayList(); } } public class GeneralTreeTest { public static void main(String[] args) { TreeNode root ..

데크 (Deque)

Double-ended queue의 줄임말로, 양쪽 끝에서 삽입과 삭제가 모두 가능한 자료구조 package datastructure.linear; import java.util.*; public class DequeTest { public static void main(String[] args) { // Deque 생성 Deque deque = new LinkedList(); // 데크 앞뒤로 원소 추가 deque.addFirst("First"); // Deque 앞에 원소 추가 deque.addLast("Last"); // Deque 뒤에 원소 추가 // 데크 출력 System.out.println("Deque: " + deque); // 출력: Deque: [First, Last] // 앞뒤 원소 ..

큐 (Queue)

데이터를 선입선출(FIFO - First-In-First-Out) 방식으로 관리하는 자료구조로써 가장 먼저 추가된 데이터가 가장 먼저 꺼내지게 됨 package datastructure.linear; import java.util.LinkedList; import java.util.Queue; public class QueueTest { public static void main(String[] args) { // 큐 생성 Queue queue = new LinkedList(); // 데이터 추가 (enqueue) queue.offer(1); queue.offer(2); queue.offer(3); // 큐의 상단 데이터 확인 (peek) System.out.println("Front element: "..

스택 (Stack)

데이터를 후입선출(LIFO - Last-In-First-Out) 방식으로 관리하는 자료구조로써 데이터는 스택의 가장 위에 쌓이고, 가장 위에 있는 데이터가 먼저 꺼내짐 package datastructure.linear; import java.util.Stack; public class StackTest { public static void main(String[] args) { // 스택 생성 Stack stack = new Stack(); // 데이터 추가 (push) stack.push(1); stack.push(2); stack.push(3); // 스택의 상단 데이터 확인 (peek) System.out.println("Top element: " + stack.peek()); // 스택에서 데이..

연결 리스트 (Linked List)

데이터를 노드(Node)로 구성하고 노드들이 포인터를 통해 연결된 리스트 데이터의 동적인 관리와 삽입/삭제 연산이 주로 필요한 경우에 유용하며, 특히 크기가 미리 예측하기 어려운 상황에서 활용됨 장점 크기의 제한이 없음: 연결 리스트는 동적으로 크기를 조절할 수 있으므로, 데이터의 추가 및 삭제가 자유로움 삽입과 삭제가 용이: 원하는 위치에 노드를 추가하거나 삭제하기가 상대적으로 간단하며 포인터로 연결되어 있어 가리키는 노드만 변경 메모리 효율적 활용: 크기가 동적이므로 필요한 메모리만 사용하며, 메모리의 재사용이 가능 데이터의 순차적 배치: 데이터 입력시 주소가 순차적이지 않아 요소를 메모리의 어느곳에나 배치할 수 있어 메모리 관리 측면에서 유용 단점 랜덤 액세스 불가: 연결 리스트는 노드들이 포인터로..