정진(바르게 나아가기)
/
포스트
/
자료구조
/
자료 구조
Search
Share
자료 구조
갤러리 보기
Search
•
데이터를 나열하고, 각 데이터를 인덱스에 대응하도록 구성한 데이터 구조
•
파이썬에서는 리스트 타입이 배열 기능을 제공함
1.
배열은 왜 필요할까?
•
같은 종류의 데이터를 효율적으로 관리하기 위해 사용 ex)학교 특정 반의 학생들의 이름
•
같은 종류의 데이터를 순차적으로 저장
•
장점
◦
빠른 접근 가능
▪
첫 데이터의 위치에서 상대적인 위치로 데이터 접근(인덱스 번호로 접근)
•
단점
◦
데이터 추가/삭제의 어려움
▪
미리 최대 길이를 지정해야 함
참고 : Primitive 자료형과 Wrapper 클래스
•
자바에서는 int와 integer 같이, Primitive 자료형과 Wrapper 클래스가 있음
•
Wrapper 클래스 - null을 용이하게 처리
2.
JAVA와 배열
•
java에서는 기본 문법으로 배열 지원 가능
◦
1차원 배열은 []를 통해 선언할 수 있음
◦
각 아이템은 {} 내에 콤마로 작성
1. 배열(Array)
2022/06/16 04:59
1.
큐 구조
•
줄을 서는 행위와 유사
•
가장 먼저 넣은 데이터를 가장 먼저 꺼낼 수 있는 구조(FIFO)
◦
음식점에서 가장 먼저 줄을 선 사람이 제일 먼저 음식점에서 입장하는 것과 동일
◦
FIFO 또는 LILO 방식으로 스택과 꺼내는 순서가 반대
b.
알아둘 용어
i.
Enqueue : 큐에 데이터를 넣는 기능
ii.
Dequeue : 큐에서 데이터를 꺼내는 기능
c.
자바에서의 큐 자료구조 사용하기
•
자바에서는 기본적으로 java,util 패키지에 Queue 클래스를 제공하고 있음
◦
Enqueue 에 해당하는 기능으로 Queue 클래스에서는 add(value) 또는 offer(value) 메서드를 제공함
◦
Dequeue 에 해당하는 기능으로 Queue 클래스에서는 poll() 또는 remove() 메서드를 제공함
◦
아쉽게도, Queue 클래스에 데이터 생성을 위해서는 java.util 패키지에 있는 LinkedList 클래스를 사용해야함
▪
LinkedList 클래스는 자료구조의 링크드리스트와 연관이 있으며, 관련 내용은 큐보다 복잡하므로 이후 챕터에서 상세히 익히도록 함
Queue 클래스 사용해보기
// Queue 사용을 위해, LinkedList 클래스를 사용하므로, 두 클래스 모두 import 해야 함
import
java
.
util
.
LinkedList
;
import
java
.
util
.
Queue
;
// 자료형 매개변수를 넣어서, 큐에 들어갈 데이터의 타입을 지정해야 함
Queue
<
Integer
>
queue_int
=
new
LinkedList
<
Integer
>
(
)
;
// Integer 형 queue 선언
Queue
<
String
>
queue_str
=
new
LinkedList
<
String
>
(
)
;
// String 형 queue 선언
Java
복사
// 데이터 추가는 add(value) 또는 offer(value) 를 사용함
queue_int
.
add
(
1
)
;
queue_int
.
offer
(
2
)
;
// 출력에 true 라고 출력되는 부분은 offer() 메서드가 리턴한 값으로,
// 셀의 맨 마지막에 함수를 넣을 경우, 변수가 변수값이 출력되는 것처럼 함수는 함수 리턴값이 출력되는 것임
Java
복사
// Queue 인스턴스를 출력하면, 해당 큐에 들어 있는 아이템 리스트가 출력됨
System
.
out
.
println
(
queue_int
)
Java
복사
// poll() 은 큐의 첫 번째 값 반환, 해당 값은 큐에서 삭제
queue_int
.
poll
(
)
;
Java
복사
// 바로 현재 큐의 아이템을 확인해보면, poll() 을 통해 반환된 값은 삭제되었음을 알 수 있음
queue_int
Java
복사
// poll() 과 마찬가지로, 첫 번째 값 반환하고, 해당 값은 큐에서 삭제
queue_int
.
remove
(
)
Java
복사
참고 : 어디에 큐가 많이 쓰일까?
1. 대표적인 데이터 구조 : 큐(Queue)
2022/06/16 05:53
•
데이터를 제한적으로 접근할 수 있는 구조
◦
한쪽 끝에서만 자료를 넣거나 뺄 수 있는 구조
◦
가장 나중에 쌓은 데이터를 가장 먼저 빼낼 수 있는 데이터 구조
▪
큐 : FIFO 정책
▪
스택 : LIFO 정책
1.
스택 구조
•
스택은 LIFO(Last in, First Out) 또는 FILO(First in Last Out) 데이터 관리 방식을 따름
•
대표적인 스택의 활용
◦
컴퓨터 내부의 프로세스 구조의 함수 동작 방식
•
주요 기능
◦
push() : 데이터를 스택에 넣기
◦
pop() : 데이터를 스택에서 꺼내기
2.
자료 구조 스택의 장단점
◦
장점
▪
구조가 단순해서 구현이 쉽다
▪
데이터 저장/읽기 속도가 빠르다.
◦
단점
▪
데이터 최대 갯수를 미리 알아야한다.
▪
저장 공간의 낭비가 발생할 수 있음
•
미리 최대 갯수만큼 저장 공간을 확보해야 하므로
스택은 단순하고 빠른 성능을 위해 사용되므로, 보통 배열 구조를 활용해서 구현하는 것이 일반적임.
이 경우, 위에서 열거한 단점이 있을 수 있음.
3.
자바에서 스택 자료 구조 사용하기
◦
자료구조와 알고리즘은 주요 개념을 이해하고, 알고리즘은 변수, 조건, 반복문으로 직접 구현 할 수 있어야 한다.
◦
각 언어별로 이미 작성된 자료구조/알고리즘 , 함수/클래스를 익히는 것은 본 강의의 목적과는 다르지만, 참고로 설명드리는 것
JAVA Stack 클래스
◦
java.util 패키지에서 Stack 클래스 제공
▪
push(아이템) 메서드 : 아이템을 Stack에 추가
▪
pop() 메서드 : Stack에서 마지막에 넣은 아이템을 리턴하고, 해당 아이템은 Stack에서 삭제
// java.util.Stack 클래스 임포트
import
java
.
util
.
Stack
;
// 자료형 매개변수를 넣어서, 스택에 들어갈 데이터의 타입을 지정해야 함
Stack
<
Integer
>
stack_int
=
new
Stack
<
Integer
>
(
)
;
// Integer 형 스택 선언
Java
복사
stack_int
.
push
(
1
)
;
// Stack 에 1 추가
stack_int
.
push
(
2
)
;
// Stack 에 2 추가
stack_int
.
push
(
3
)
;
// Stack 에 3 추가 (출력에 나온 부분은 push() 성공시,
해당 아이템을 리턴해주기 때문임
)
Java
복사
stack_int
.
pop
(
)
;
// Stack 에서 데이터 추출 (마지막에 넣은 3이 출력)
Java
복사
stack_int
.
pop
(
)
;
// Stack 에서 데이터 추출 (현재 Stack 에 있는 데이터 중,
가장 나중에 넣어진 데이터 출력
)
Java
복사
3. 스택(Stack)
2022/06/17 06:37
1.
링크드 리스트(Linked List) 구조
•
연결 리스트라고도 함
•
배열은 순차적으로 연결된 공간에 데이터를 나열하는 데이터 구조
•
링크드 리스트는 떨어진 곳에 존재하는 데이터를 화살표로 연결해서 관리하는 데이터 구조
•
링크드 리스트 기본구조와 용어
◦
노드(Node) : 데이터 저장 단위(데이터 값, 포인터)로 구성
◦
포인터 : 각 노드 안에서, 다음이나 이전의 노드와의 연결 정보를 가지고 있는 공간
2.
간단한 링크드 리스트 예
•
최대한 간단한 형태로 코드로 작성해보며 링크드 리스트를 이해해 보기
4. 링크드 리스트( Linked List)
2022/06/17 06:53
1.
알고리즘 복잡도
•
하나의 문제를 푸는 알고리즘은 다양할 수 있음
◦
정수의 절대값 구하기
◦
1,-1 → 1
◦
방법1 : 정수값을 제곱한 값에 다시 루트를 씌우기
◦
방법2: 정수가 음수인지 확인해서, 음수일 때만, -1 을 곱하기
◦
다양한 알고리즘 중 어느 알고리즘이 더 좋은지를 분석하기 위해, 복잡도를 정의하고 계산함
2.
알고리즘 복잡도 계산 항목
a.
시간 복잡도 : 알고리즘 실행 속도
b.
공간 복잡도 : 알고맂므이 사용하는 메모리 사이즈
- 가장 중요한 시간 복잡도를 꼭 이해라고 계산할 수 있어야함.
3.
알고리즘 시간 복잡도의 주요 요소
- 반복문이 지배
자동차로 서울에서 부산을 가기 위해, 다음과 같이 항목을 나누었을 때, 가장 총 시간에 영향을 많이 미칠 것 같은 요소는?
•
자동차로 서울에서 부산가기
1.
자동차 문열기
2.
자동차 문닫기
3.
자동차 운전석 등받이 조정하기
4.
자동차 시동걸기
5.
자동차로 서울에서 부산가기
6.
자동차 시동끄기
7.
자동차 문열기
8.
자동차 문닫기
•
마찬가지로, 프로그래밍에서 시간 복잡도에 가장 영향을 많이 미치는 요소는 반복문
◦
입력의 크기가 커지면 커질수록 반목문이 알고리즘 수행 시간을 지배함
알고리즘 성능 표기법
5. 알고리즘 복잡도 표현 방법
2022/06/17 07:23
1.
해쉬 테이블
•
키에 데이터(value)를 매핑할 수 있는 구조
•
해쉬 함수를 통해, 배열에 키에 대한 데이터를 저장할 수 있는 주소를 계산
•
Key를 통해 바로 데이터가 저장되어 있는 주소를 알 수 있으므로, 저장 및 탐색 속도가 획기적으로 빨라짐
•
미리 해쉬 함수가 생성할 수 있는 주소에 대한 공간을 배열로 할당한 후, 키에 따른 데이터 저장 및 탐색 지원
2.
알아둘 용어
•
해쉬 함수 : 임의의 데이터를 고정된 길이의 값으로 리턴해주는 함수
◦
해쉬, 해쉬 값, 또는 해쉬 주소 : 해싱 함수를 통해 리턴된 고정된 길이의 값
•
해쉬 테이블 : 키 값의 연산에 의해 직접 접근이 가능한 데이터 구조
◦
슬롯 : 해쉬 테이블에서 한 개의 데이터를 저장할 수 있는 공간
6. 해쉬 테이블(Hash Table)
2022/06/17 08:42
•
트리 : Node 와 Branch를 이용해서, 사이클을 이루지 않도록 구성한 데이터 구조
•
실제로 어디에 많이 사용되나?
◦
트리 중 이진 트리 형태의 구조로, 탐색(검색) 알고리즘 구현을 위해 많이 사용됨
2.
알아둘 용어
•
Node : 트리에서 데이터를 저장하는 기본요소(데이터와 다른 연결된 노드에 대한 Branch 정보 포함)
•
Root Node : 트리 맨 위에 있는 노드
•
Level : 최상위 노드를 Level 0 으로 하였을 때, 하위 Branch로 연결된 노드의 깊이를 나타냄
•
Parent Node : 어떤 노드의 다음 레벨에 연결된 노드
•
Child Node : 어떤 노드의 상위 레벨에 연결된 노드
•
Leaf Node(Terminal Node) : Child Node 가 하나도 없는 노드
•
Sibling (Brother Node) : 동일한 Parent Node를 가진 노드
•
Depth : 트리에서 Node가 가질 수 있는 최대 Level
3.
이진 트리와 이진 탐색 트리
•
이진 트리 : 노드의 최대 Branch가 2인 트리
•
이진 탐색 트리 : 이진 트리에 다음과 같은 추가적인 조건이 있는 트리
◦
왼쪽 노드는 해당 노드보다 작은 값, 오른쪽 노드는 해당 노드보다 큰 값을 가지고 있음
4.
자료 구조 이진 탐색 트리의 장점과 주요 용도
•
주요 용도 : 데이터 검색(탐색)
•
장점 : 탐색 속도를 개선할 수 있음
5.
자바 객체지향 프로그래밍으로 링크드 리스트 구현하기
5.1. 노드 클래스 만들기
public
class
NodeMgmt
{
public
class
Node
{
Node
left
;
Node
right
;
int
value
;
public
Node
(
int
data
)
{
this
.
value
=
data
;
this
.
left
=
null
;
this
.
right
=
null
;
}
}
}
Java
복사
5.2. 이진 탐색 트리에 데이터 넣기
public
class
NodeMgmt
{
Node
head
=
null
;
public
class
Node
{
Node
left
;
Node
right
;
int
value
;
public
Node
(
int
data
)
{
this
.
value
=
data
;
this
.
left
=
null
;
this
.
right
=
null
;
}
}
public
boolean
insertNode
(
int
data
)
{
if
(
this
.
head
==
null
)
{
this
.
head
=
new
Node
(
data
)
;
}
else
{
Node
findNode
=
this
.
head
;
while
(
true
)
{
if
(
data
<
findNode
.
value
)
{
if
(
findNode
.
left
!=
null
)
{
findNode
=
findNode
.
left
;
Java
복사
7. 트리(Tree) 구조
2022/06/23 06:15
1.
힙 이란?
•
힙 : 데이터에서 최대값과 최소값을 빠르게 찾기 위해 고안된 완전 이진 트리
•
완전 이진 트리 : 노드를 삽입할 때 최하단 왼쪽 노드부터 차례대로 삽입하는 트리
•
힙을 사용하는 이유
◦
배열에 데이터를 넣고, 최대값과 최소값을 찾으려면 O(n)이 걸림
◦
이에 비해, 힙에 데이터를 넣고, 최대값과 최소값을 찾으면 O(logn)이 걸림
◦
우선순위 큐와 같이 최대값 또는 최소값을 빠르게 찾아야 하는 자료구조 및 알고리즘 구현 등에 활용됨
2.
힙(Heap) 구조
•
힙은 최대값을 구하기 위한 구조(최대 힙,Max Heap)와, 최소값을 구하기 위한 구조(최소 힙,Min Heap)로 분류할 수 있음
•
힙은 다음과 같이 두 가지 조건을 가지고 있는 자료구조임
1.
각 노드의 값은 해당 노드의 자식 노드가 가진 값보다 크거나 같다.(최대 힙의 경우)
•
최소 힙의 경우는 각 노드의 값은 해당 노드의 자식 노드가 가진 값보다 크거나 작음
2.
완전 이진 트리 형태를 가짐
•
힙과 이진 탐색 트리의 공통점과 차이점
◦
공통점 : 힙과 이진 탐색 트리는 모두 이진 트리임
◦
차이점 :
▪
힙은 각 노드의 값이 자식 노드보다 크거나 같음(Max Heap의 경우)
▪
이진 탐색 트리는 왼쪽 자식 노드의 값이 가장 작고, 그 다음 부모 노드, 그 다음 오른쪽 자식 노드 값이 가장 큼
▪
힙은 이진 탐색 트리의 조건인 자식 노드에서 작은 값은 왼쪽, 큰 값은 오른쪽이라는 조건은 없음
◦
이진 탐색 트리는 탐색을 위한 구조, 힙은 최대/최소값 검색을 위한 구조 중 하나로 이해하면 됨
3.
힙 동작
•
데이터를 힙 구조에 삽입, 삭제 하는 과정을 그림을 통해 선명하게 이해하기
•
힙에 데이터 삽입하기 - 기본 동작
◦
힙은 완전 이진 트리이므로, 삽입할 노드는 기본적으로 왼쪽 최하단부 노드부터 채워지는 형태로 삽입
8. 힙(Heap)
2022/06/24 05:37