본문 바로가기

자료구조와 알고리즘23

스택(Stack) Stack 자바에서 Stack은 java.util.Stack을 import하여 사용할 수 있으며, 자바의 컬렉션 프레임워크 중 List 인터페이스의 구현체이다. 직접 스택을 구현하지 않아도 자바에서 제공하는 라이브러리를 이용하면 쉽게 사용할 수 있다. Stack 개념 Stack은 '쌓다' 라는 의미로 어떠한 저장 공간에 데이터를 계속 쌓아올리는 것을 말한다. 위 그림처럼 쌓다보면 가장 마지막에 넣은 데이터를 먼저 꺼내게 되는데 이러한 구조 LIFO(Last In First Out)라고 한다. 스택이 비어있는데 데이터를 꺼내려고 하면 스택 언더플로우(Stack Underflow) 에러 발생 스택이 꽉 차 있는데 데이터를 더 넣으려고 하면 스택 오버플로우(Stack Overflow) 에러 발생.. 2023. 2. 28.
단방향 LinkedList에 대해 간략히 알아보자. LinkedList LinkedList 자료구조에 대해 간략히 알아보겠습니다. LinkedList는 자바 컬렉션 프레임워크 중 List 인터페이스의 구현체이다. List 자료구조의 특징이 순서가 있는 데이터 집합으로 중복이 허용된다. LinkedList 개념 LinkedList란 일렬로 연결된 데이터를 저장할 때 사용한다. 데이터를 저장할 수 있는 공간을 노드(Node)라 하며, 각 노드는 다음 데이터의 주소를 가지고 있다. 배열과 비교하기 배열의 구조는 동일한 크기의 메모리 공간이 빈틈없이 연속적으로 나열된 자료구조이다. 따라서 배열의 크기를 한번 정하면 늘이거나 줄일 수가 없다. (고정적 크기) 따라서 배열에서 중간에 데이터를 추가하려면 새로운 크기의 배열을 다시 선언하여 복사해서 추가해야한다. 하지.. 2023. 2. 26.
그리디(Greedy) 알고리즘 그리디 알고리즘 그리디(Greedy) 알고리즘, 다른 말로 탐욕법은 현재 상황에서 지금 당장 좋은 것만 고르는 방법을 뜻합니다. 일반적인 그리디 알고리즘은 문제를 풀기 위한 최소한의 아이디어를 떠올릴 수 있는 능력을 요구합니다. 즉, 특정한 문제를 만났을 때 단순히 현재 상황에서 가장 좋아 보이는 것만을 선택해도 문제를 풀 수 있는지를 파악할 수 있어야 합니다. 그리디 알고리즘은 기준에 따라 좋은 것을 선택하는 알고리즘이므로 '가장 큰 순서대로', '가장 작은 순서대로' 와 같은 기준을 알게 모르게 제시해줍니다. 이 기준은 정렬 알고리즘을 사용했을 때 만족시킬 수 있으므로 그리디 문제는 정렬 알고리즘과 같이 자주 출제됩니다. 또한 그리디 알고리즘은 정당성 분석이 중요합니다. 단순히 가장 좋아보이는 것을 .. 2020. 9. 5.
계수 정렬(Counting Sort) 계수 정렬(Counting Sort) 1 2 3 2 4 1 2 3 4 5 4 5 2 5 2 3 4 1 2 4 1 2 2 1 1 위와 같은 25개의 숫자가 있다고 가정해봅시다. 여기서 "5이하인 자연수들을 오름차순으로 정렬하세요" 라는 '범위 조건' 있는 경우에 한해서는 매우 빠른 알고리즘이 바로 계수 정렬 입니다. 계수 정렬의 속도는 O(N) 으로 다른 퀵 정렬, 힙 정렬, 병합 정렬보다도 빠른 속도입니다. 계수 정렬은 Counting Sort 의 말그대로 "크기를 기준으로 각각의 크기별로 카운팅해준다" 입니다. 크기별로 카운팅할 수 있는 이유는 범위 조건 이 존재하기 때문에 이렇게 분류를 할 수 있는 것입니다. 크기별로 카운팅을 해주었다면 해당 크기마다 작은 순서대로 쭉 적어놓으면 됩니다. 크기=1 크.. 2020. 8. 7.
자료구조 기초 선형 탐색 선형 탐색(Linear Search)이란 int[] arr = {1, 2, 5, 4, 8, 10, 9, 3, 6, 7} 라는 배열이 있을 때, 왼쪽에서 오른쪽으로 한 번에 한 셀씩 확인하는 방법을 말합니다. 선형 탐색은 arr의 길이가 총 10 이므로 최악의 경우에는 총10번을 확인해야 결과를 얻을 수 있습니다. 다음은 선형 탐색의 코드입니다. public class Main { public static void main(String[] args) { int[] arr = {1, 2, 5, 4, 8, 10, 9, 3, 6, 7}; int num = 5; System.out.println("횟수: " + Linear.linearSearch(arr, num)); } } class Linear { .. 2020. 7. 30.