자료구조는 데이터를 저장하고 관리하는 방식을 말합니다. 이는 데이터를 체계적으로 저장하여 메모리를 효율적으로 사용하고, 빠르고 안정적으로 데이터를 처리할 수 있도록 도와줍니다.
선형 자료구조 (Linear Data Structures)
선형 자료구조는 데이터가 연속적으로 나열된 형태를 가지며, 각 데이터 요소가 순차적으로 연결된 구조를 의미합니다. 데이터 요소들 간의 관계가 1:1입니다.
- 배열 (Array)
- 연속된 메모리 공간에 데이터 저장
- 고정된 크기
- 인덱스를 통한 빠른 접근
- 동적 배열 (Dynamic Array)
- 크기가 가변적인 배열
- 필요 시 크기를 동적으로 조절
- 추가 및 삭제가 용이
- 연결 리스트 (Linked List)
- 노드가 데이터와 포인터를 포함
- 크기가 가변적
- 삽입 및 삭제가 용이
- 큐 (Queue)
- FIFO (First In, First Out) 원칙
- 삽입은 뒤에서, 삭제는 앞에서 수행
- 스택 (Stack)
- LIFO (Last In, First Out) 원칙
- 삽입과 삭제가 한쪽 끝에서만 일어남
- 해시 테이블 (Hash Table)
- 키-값 쌍을 저장
- 해시 함수를 통해 빠른 접근
- 충돌 관리 기법 필요
비선형 자료구조 (Non-Linear Data Structures)
비선형 자료구조는 데이터 요소들이 계층적 또는 네트워크 형태로 연결된 구조를 의미합니다. 데이터 요소들 간의 관계가 1:다 또는 다:다입니다.
- 트리 (Tree)
- 계층적 구조
- 루트 노드에서 시작하여 자식 노드로 분기
- 이진 트리, AVL 트리, 이진 탐색 트리 등 다양한 형태
- 그래프 (Graph)
- 노드(정점)와 간선(엣지)으로 구성
- 방향 그래프와 무방향 그래프 존재
- 최단 경로 탐색, 네트워크 모델링 등에 사용
자료구조를 배우는 것은 알고리즘을 이해하고 효율적으로 구현하는 데 필수적입니다. 다양한 자료구조의 특성과 장단점을 이해하고, 문제에 적합한 자료구조를 선택할 수 있는 능력은 코딩 테스트뿐만 아니라 실제 소프트웨어 개발에서도 매우 중요합니다.
알고리즘 (Algorithm)
알고리즘은 문제를 해결하기 위한 정해진 일련의 절차나 방법입니다. 알고리즘은 다양한 문제를 해결하기 위해 자주 사용되며, 그 유형에 따라 패턴화된 방법들이 있습니다.
알고리즘의 정의
- 문제 해결 방법: 어떠한 문제를 해결하기 위해 정해진 일련의 절차나 방법
- 패턴화된 알고리즘: 자주 쓰이는 문제 해결 방법은 패턴화되어 있습니다.
자주 쓰이는 알고리즘 패턴
- BFS (Breadth-First Search)
- 너비 우선 탐색
- 큐를 사용하여 가까운 노드부터 탐색
- 최단 경로 찾기 등에 사용
- DFS (Depth-First Search)
- 깊이 우선 탐색
- 스택을 사용하여 깊이 있는 노드부터 탐색
- 경로 찾기, 사이클 검출 등에 사용
- 이진 탐색 (Binary Search)
- 정렬된 배열에서 탐색을 수행
- 절반씩 탐색 범위를 줄여나감
- O(log n)의 시간 복잡도
- 다익스트라 알고리즘 (Dijkstra's Algorithm)
- 가중치가 있는 그래프에서 최단 경로를 찾는 알고리즘
- 우선순위 큐를 사용하여 구현
- 네트워크 경로 찾기 등에 사용
알고리즘의 다양성
한 문제를 해결할 수 있는 알고리즘은 다양하며, 각 문제에 적합한 알고리즘을 선택하고 평가할 수 있어야 합니다.
알고리즘 선택
- 문제의 특성 파악: 문제의 특성에 따라 가장 적합한 알고리즘을 선택
- 예: 짧은 경로를 찾는 문제에서는 BFS나 다익스트라 알고리즘을 선택
- 시간 및 공간 복잡도 고려: 알고리즘의 효율성을 평가
- 예: 데이터가 큰 경우 시간 복잡도가 낮은 알고리즘을 선택
알고리즘 평가
- 시간 복잡도: 알고리즘이 문제를 해결하는 데 걸리는 시간
- 예: O(n), O(log n), O(n^2) 등
- 공간 복잡도: 알고리즘이 문제를 해결하는 데 사용하는 메모리 공간
- 예: O(1), O(n), O(n^2) 등
- 정확성: 알고리즘이 정확한 결과를 도출하는지 여부
- 단순성: 알고리즘의 구현이 얼마나 쉬운지 여부
- 확장성: 알고리즘이 더 큰 문제나 다양한 문제에 얼마나 잘 적용되는지 여부
알고리즘 평가 기준
알고리즘을 평가하는 주요 기준은 다음과 같습니다:
- 시간 복잡도 (Time Complexity)
- 알고리즘이 문제를 해결하는 데 걸리는 시간을 나타냅니다.
- 주로 빅오 표기법(O-notation)을 사용하여 표현합니다.
- 예: O(1), O(log n), O(n), O(n^2) 등.
- 공간 복잡도 (Space Complexity)
- 알고리즘이 문제를 해결하는 데 사용하는 메모리 공간을 나타냅니다.
- 주로 빅오 표기법으로 표현합니다.
- 예: O(1), O(n), O(n^2) 등.
- 구현 복잡도 (Implementation Complexity)
- 알고리즘의 구현이 얼마나 쉬운지를 평가합니다.
- 코드의 길이, 가독성, 유지보수 용이성 등을 고려합니다.
시간 복잡도의 중요성
- 코딩 테스트나 실제 소프트웨어 개발에서는 실행 시간을 줄이는 것이 매우 중요합니다.
- 많은 데이터나 복잡한 연산을 다루는 경우, 시간 복잡도가 낮은 알고리즘을 사용하는 것이 성능 향상에 큰 도움이 됩니다.
시간 복잡도와 공간 복잡도의 Trade-off
- 시간 복잡도와 공간 복잡도는 보통 상호 간에 trade-off 관계가 있습니다.
- Trade-off 예시:
- 실행 시간을 줄이기 위해 더 많은 메모리를 사용하는 경우.
- 메모리 사용을 줄이기 위해 실행 시간이 늘어나는 경우.
코딩 테스트에서의 전략
- 시간 복잡도 줄이기
- 메모리를 사용해서 실행 시간을 줄이는 방법을 고려합니다.
- 예: 메모이제이션(Memoization), 캐싱(Caching) 기법을 사용하여 중복 계산을 피하는 방법.
- 미리 계산된 시간 복잡도 고려
- 문제 조건에 맞춰 적절한 알고리즘을 선택합니다.
- 예: 입력 데이터의 크기에 따라 O(n log n) 또는 O(n^2) 알고리즘 중에서 선택.
- 구현의 용이성
- 구현이 복잡하지 않으면서도 성능이 좋은 알고리즘을 선택하는 것이 중요합니다.
- 코드의 가독성과 유지보수성을 고려하여 구현 복잡도가 낮은 알고리즘을 선택합니다.
메모리와 저장소에 대한 이해
데이터를 저장하고 관리하는 두 가지 주요 메모리 유형과 그 작동 방식을 설명하겠습니다.
1. 하드 디스크 (Hard Disk)
- 역할: 데이터를 영구적으로 저장하는 장치입니다.
- 특징:
- 대용량 데이터를 저장할 수 있습니다.
- 전원이 꺼져도 데이터가 유지됩니다.
- 읽기/쓰기 속도가 상대적으로 느립니다.
- 사용 예:
- 운영체제, 응용 프로그램, 문서 파일 등을 저장.
- 코드를 작성하고 저장 버튼을 누르면 코드가 하드 디스크에 저장됩니다.
2. 램 메모리 (RAM, Random Access Memory)
- 역할: 데이터를 일시적으로 저장하여 CPU가 빠르게 접근할 수 있도록 합니다.
- 특징:
- 읽기/쓰기 속도가 매우 빠릅니다.
- 전원이 꺼지면 데이터가 사라집니다.
- 컴퓨터가 실행 중인 프로그램과 데이터를 저장합니다.
- 사용 예:
- 프로그램 실행 시 필요한 데이터를 저장.
- 코드를 실행하면 해당 코드와 관련 데이터가 램 메모리에 로드되어 CPU가 빠르게 접근할 수 있습니다.
RAM 메모리와 이진수 표현
트랜지스터와 비트
- RAM 메모리: 전기 신호를 저장할 수 있는 트랜지스터라는 작은 반도체 소자로 이루어져 있습니다.
- 트랜지스터: 전기가 ON이면 1, OFF면 0을 나타냅니다.
- 비트 (Bit): 1비트는 두 가지의 상태(0 또는 1)를 표현할 수 있습니다.
비트와 데이터 표현
- 1비트: 두 가지 상태 (0, 1) 표현 가능.
- 2비트: 4가지 상태 (00, 01, 10, 11) 표현 가능.
- 8비트: 256가지 상태 (2의 8승) 표현 가능.
- 바이트 (Byte): 8비트는 1바이트(Byte)라고 하며, 이는 256가지 상태를 표현할 수 있습니다.
데이터 크기 단위
- 비트 (bit): 가장 작은 데이터 단위.
- 바이트 (Byte): 8비트 = 1바이트.
- 킬로바이트 (KB): 1024바이트 = 1KB.
- 메가바이트 (MB): 1024KB = 1MB.
- 기가바이트 (GB): 1024MB = 1GB.
- 테라바이트 (TB): 1024GB = 1TB.
16진법
- 16진법: 이진법으로 표현하기 힘든 큰 숫자를 더 쉽게 표현하기 위해 사용됩니다.
- 16진수: 0~9와 A, B, C, D, E, F로 표현. (A=10, B=11, ..., F=15)
예시: 노트북의 RAM 메모리
- 8GB RAM:
- 8GB는 8 × 1024MB = 8192MB.
- 1MB는 1024KB = 1048576바이트.
- 따라서, 8GB RAM은 8192 × 1048576바이트 = 8589934592바이트.
메모리 사용 예시
- 1MB 메모리:
- 1MB는 1024KB.
- 1KB는 1024바이트.
- 1바이트는 8비트.
- 따라서, 1MB는 1024 × 1024바이트 = 1048576바이트 = 8388608비트.
자바 (Java)의 데이터 타입 크기
- byte:
- 크기: 1 바이트 (8비트)
- 값 범위: -128 ~ 127
- short:
- 크기: 2 바이트 (16비트)
- 값 범위: -32,768 ~ 32,767
- int:
- 크기: 4 바이트 (32비트)
- 값 범위: -2,147,483,648 ~ 2,147,483,647
- long:
- 크기: 8 바이트 (64비트)
- 값 범위: -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
- float:
- 크기: 4 바이트 (32비트)
- 값 범위: 1.4E-45 ~ 3.4E+38
- double:
- 크기: 8 바이트 (64비트)
- 값 범위: 4.9E-324 ~ 1.7E+308