20260402 데이터구조와 알고리즘 5주차
배열, 구조체, 포인터 핵심 정리
1. 배열 (Array)
핵심 개념
- 같은 타입 데이터 묶음
- 메모리에 연속적으로 저장됨
int list[6];
기본 연산
list[i] = 값→ setvalue = list[i]→ get
2차원 배열
int list[3][5];
사실상 행렬
2. 구조체 (Struct)
핵심 차이
- 배열: 같은 타입
- 구조체: 다른 타입 묶음
선언
struct studentTag {
char name[10];
int age;
double gpa;
};
사용
struct studentTag s;
s.age = 20;
typedef (시험 단골)
typedef struct {
char name[10];
int age;
double gpa;
} student;
이제 student s; 바로 가능
3. 다항식 표현 (시험 핵심)
방식 1: 모든 항 저장 (비효율)
typedef struct {
int degree;
float coef[MAX];
} polynomial;
특징
- 장점: 구현 쉬움
- 단점: 0 많으면 메모리 낭비
방식 2: 0 아닌 항만 저장 (핵심)
struct {
float coef;
int expon;
} terms[MAX];
예
10x^5 + 6x + 3
→ (10,5), (6,1), (3,0)
특징
- 장점: 메모리 효율
- 단점: 구현 복잡
다항식 덧셈 핵심 로직
-
차수 비교해서:
- 크면 그대로 복사
- 같으면 더함
- 작으면 상대 복사
이거 이해 못하면 시험에서 코드 못 읽는다
4. 희소 행렬 (Sparse Matrix)
개념
- 대부분 값이 0인 행렬
표현 1: 2차원 배열
- 쉽지만 메모리 낭비
표현 2: (row, col, value) 저장
typedef struct {
int row;
int col;
int value;
} element;
핵심: 0 제외하고 저장
전치 (transpose)
b.row = a.col;
b.col = a.row;
그냥 행/열 swap임
5. 포인터 (Pointer)
정의
- 주소를 저장하는 변수
char a = 'A';
char *p = &a;
핵심 연산자
&→ 주소*→ 값
*p = 'B'; // 값 변경
포인터 타입
int *p;
float *pf;
char *pc;
타입 중요 (메모리 크기 때문)
6. 함수 + 포인터 (개념 핵심)
swap 예제
void swap(int *px, int *py)
포인터로 넘기면
원본 값 바뀜 (call by reference)
7. 배열 vs 포인터 (중요)
sum += *(list + i);
이거 사실:
sum += list[i];
동일함
배열 이름 = 주소 (포인터처럼 동작)
8. 동적 메모리 (malloc)
개념
- 실행 중 메모리 할당
int *p = malloc(sizeof(int));
해제
free(p);
실전 패턴
p = malloc(N * sizeof(int));
if (p == NULL) exit(1);
이거 안 쓰면 런타임 터짐
9. 구조체 + 포인터
p->age = 20;
이거 =
(*p).age = 20;
그냥 -> 써라
진짜 중요한 포인트 (시험용 핵심)
- 배열 이름 = 포인터처럼 사용됨
*(a+i)=a[i]- 구조체는 . vs -> 구분
- malloc → 반드시 free
- 다항식 2가지 방식 (둘 다 나옴)
- 희소행렬 → (row, col, value)
- 포인터 →
*값 /&주소