선형 구조와 비선형 자료구조
선형 구조(Linear Structure)
순회하는 방법
•
반복문 (for, while) 사용
선형리스트 (Linear List)
특징
•
그럼기 때문에 각 원소의 순서가 정해져 있으며, 각 원소의 인덱스를 사용할 수 있다
•
이로인해 데이터 검색에 효율적이지만, 삽입과 삭제 시 크기를 타 항목하거나, 모든 데이터를 이동해야하기 때문에 비효율적이다
링크드 리스트 (Linked List)
특징
•
선형리스트와 달리 고정이 아닌, 가변적인 크기의 리스트를 가진다
•
따라서 데이터를 삽입, 제거 시 크기 할 당이나, 데이터를 이동할 필요 없이 다음 노드를 추가하거나, 제거할 수 있다
•
다만, 검색에 대해서는 선형리스트와 달리게 원하는 데이터를 한번에 찾아낼 수 없고, 리스트를 전부 탐색해 야 한다
사용 시기
•
주로 데이터 삽입, 제거가 많이 발생하는 프로그램이라면 연결리스트가 유리하고, 탐색에 주가 되는 프로그램이라면 선형리스트를 사용하는 것이 유리하다
스택 (Stack)
시각적 표현
┌───┐
│ 4 │ ← top (가장 나중에 들어온 것)
├───┤
│ 3 │
├───┤
│ 2 │
├───┤
│ 1 │ ← bottom (가장 먼저 들어온 것)
└───┘
Plain Text
복사
특징
•
그럼기 때문에 마지막에 넣은 데이터가 가장 먼저 나가는 LIFO (Last-In First-Out) 구조를 가진다
•
주로 연결리스트를 통해 구현하고, 컴파일우리의 페이지 되돌아기, undo, 문자열 뒤집기와 같은 프로그램에 사용된다
큐 (Queue)
시각적 표현
← 제거 [1][2][3][4] 추가 →
(front) (rear)
Plain Text
복사
특징
•
큐의 중류에 따라 차이점이 있지만, 기본적인 큐는 한쪽으로 데이터를 넣고, 다른 한쪽으로 데이터를 뺄 수 있다
•
따라서 가장 먼저 들어온 데이터가 가장 먼저 나오는 FIFO (First-In First-Out) 구조를 가진다
•
큐는 일반적으로 연결리스트를 통해 구현하며, 선입선출을 필요로 하는 대기열, 프로세스 관리, 너비 우선 탐색에 사용된다
트리 (Tree)
시각적 표현
특징
•
마치 나무를 뒤집어 놓은 모습과 유사하다
•
트리 내 또 다른 하위 트리가 있고, 그 안에도 또 다른 하위 트리가 있는 재귀적인 구조를 가진다
•
컴퓨터의 디렉토리 구조가 트리 구조이다
주요 용어
•
루트(Root): 트리의 최상단 노드
•
부모 노드(Parent): 상위 노드
•
자식 노드(Child): 하위 노드
•
잎 노드(Leaf): 자식이 없는 노드
그래프 (Graph)
시각적 표현
트리와 그래프의 차이점
•
트리와 많이 비교가 되는데 트리 역시 그래프의 형태이나, 그래프는 방향이 있거나, 없을 수 있으며, 루트 노드라는 개념이 없다. 또한 사이클이 가능한 형태로 구성되어 있다
순회하는 방법
그래프 순회 알고리즘
•
DFS, BFS 알고리즘 사용
그래프 표현 방법
•
보통 알고리즘 문제를 풀 때는 있어서는 인접행렬을 활용한 방식을 많이 사용한다
•
다음은 인접행렬을 이용해 그래프를 표현하고 1번 노드가 연결되어있는 다른노드의 종류를 표현하는 예제 코드이다
그래프 구현 예제
#include <iostream>
int main()
{
// 4x4 인접행렬로 그래프 표현
int map[4][4] =
{
0, 0, 1, 1, // 노드 0: 2, 3과 연결
1, 0, 1, 1, // 노드 1: 0, 2, 3과 연결
0, 1, 0, 0, // 노드 2: 1과 연결
0, 0, 0, 0, // 노드 3: 연결 없음
};
int target = 1; // 노드 1에서 연결된 노드들 찾기
for (size_t i = 0; i < 4; i++)
{
std::cout << target << "번 노드 이동가능 : ";
if (map[target][i] != 0) // 연결되어 있다면
{
std::cout << i << "번";
}
}
return 0;
}
C++
복사
가중치가 있는 그래프
핵심 정리
선형 자료구조
구조 | 특징 | 주요 연산 | 사용 예시 |
배열 | 연속 메모리, 인덱스 접근 | 읽기 O(1), 삽입/삭제 O(n) | 정적 데이터 저장 |
연결리스트 | 동적 크기, 포인터 연결 | 삽입/삭제 O(1), 검색 O(n) | 동적 데이터 관리 |
스택 | LIFO 구조 | push/pop O(1) | 함수 호출, Undo 기능 |
큐 | FIFO 구조 | enqueue/dequeue O(1) | 작업 대기열, BFS |
비선형 자료구조
구조 | 특징 | 순회 방법 | 사용 예시 |
트리 | 계층적 구조, 루트 존재 | 전위/중위/후위 순회 | 파일 시스템, 검색 트리 |
그래프 | 네트워크 구조, 사이클 가능 | DFS/BFS | 지도, 네트워크, SNS |
연습문제 해결 접근법
해결 단계
1.
인접행렬 분석: 각 행을 순회하며 0이 아닌 값 찾기
2.
연결 정보 출력: 노드 번호와 가중치 함께 출력
3.
모든 노드 순회: 전체 그래프 구조 파악
•
이차원 배열 map[i][j]에서 i는 시작 노드, j는 도착 노드
•
값이 0이 아니면 연결되어 있으며, 그 값이 가중치(비용)
이렇게 선형과 비선형 자료구조의 기본 개념과 구현 방법을 이해하면, 복잡한 알고리즘 문제도 효율적으로 해결할 수 있습니다! 
“강의는 많은데, 왜 나는 아직도 코드를 못 짤까?”
혼자 공부하다 보면 누구나 이런 고민을 하게 됩니다.
•
강의는 다 들었지만 막상 손이 안 움직이고,
•
복습을 하려 해도 무엇을 다시 봐야 할지 모르겠고,
•
질문할 곳도 없고,
•
유튜브는 결국 정답을 따라 치는 것밖에 안 되는 것 같고.
문제는 ‘연습’이 빠졌기 때문입니다.
단순히 강의를 듣는 것만으로는 실력이 늘지 않습니다.
실제 문제를 풀고, 고민하고, 직접 구현해보는 시간이 반드시 필요합니다.
그래서, 얌얌코딩 코칭은 다릅니다.
그냥 가르치지 않습니다.
스스로 설계하고, 코딩할 수 있게 만듭니다.
얌얌코딩 코칭에서는 단순한 예제가 아닌,
스스로 문제를 분석하고 구현해야 하는 연습문제를 제공합니다.
이 연습문제들은 다음과 같은 역량을 키우기 위해 설계되어 있습니다:
•
문제를 스스로 쪼개고 설계하는 힘
•
다양한 조건을 만족시키는 실제 구현 능력
•
기능 단위가 아닌, 프로그램 단위로 사고하는 습관
•
마침내 자신의 힘으로 코드를 끝까지 작성하는 경험
지금 필요한 건 더 많은 강의가 아닙니다.
코드를 스스로 완성해 나가는 훈련,
그것이 지금 실력을 끌어올릴 가장 현실적인 방법입니다.