일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 백준
- VR
- XR Interaction Toolkit
- Team Fortress 2
- ue5
- 스택
- 그래프
- 다익스트라
- 문자열
- 알고리즘
- 트리
- 시뮬레이션
- 재귀
- BFS
- 수학
- 투 포인터
- 브루트포스
- 누적 합
- 유니온 파인드
- DFS
- 백트래킹
- 다이나믹 프로그래밍
- 그리디 알고리즘
- c++
- 유니티
- 구현
- 우선순위 큐
- Unreal Engine 5
- 자료구조
- 정렬
- Today
- Total
1일1알
자료구조 맛보기 본문
자료구조 : 데이터를 저장하는 여러가지 방식?
배열
int[] values = new int[10];
int타입의 변수를 10개를 가지고 있는 배열
배열의 인덱스는 0부터 시작이므로, values[0] ~ values[9] 까지 존재한다.
values[0] = 10;
values[1] = 20;
values[2] = 30;
values[10] = 40; //error
위의 코드와 같이 값을 할당할 수 있고, values의 인덱스는 0~9인데 10에 접근하면 오류가 난다.
values.Length // 10
Length를 이용해 배열의 크기를 구할 수 있다.
values.Length * sizeof(int)
int의 사이즈는 4KB이고 values는 길이가 10이기때문에 values의 크기는 4 * 10 = 40KB가 된다.
foreach(int value in values)
{
Console.WriteLine(value);
}
foreach 문 : values의 크기만큼 순차적으로 values의 원소를 접근
int[] values = new int[5] { 10, 20, 30, 40, 50 };
선언할 때 값을 같이 할당, 길이가 5개면 무조건 5개를 할당해주어야한다.
int[] values = new int[] { 10, 20, 30, 40, 50 };
int[] values = { 10, 20, 30, 40, 50 };
이렇게도 가능하다고 한다.
int[] values = new int[5] { 10, 20, 30, 40, 50 };
int[] values2 = values;
배열은 복사타입이 아닌 참조타입이다. values와 values는 같은 원본 데이터를 가지고 작업을 한다. 한 곳에서 수정을 하면 다른 곳에도 동시에 적용된다.
다차원 배열
2차원 배열 : 배열의 배열
3차원 배열 : 배열의 배열의 배열 ....
크기가 5인 1차원 배열
크기가 5 * 5인 2차원 배열
int[,] arr = new int[2, 3]
2차원 배열의 생성 문법
0,0 | 0,1 | 0,2 |
1,0 | 1,1 | 1,2 |
int[,] arr = new int[2, 3] { { 0, 1, 2 }, { 3, 4, 5 } };
int[,] arr = new int[,] { { 0, 1, 2 }, { 3, 4, 5 } };
int[,] arr = { { 0, 1, 2 }, { 3, 4, 5 } };
초기화 문법
int[,] arr = new int[2, 3] { { 0, 1, 2 }, { 3, 4, 5 } };
for(int y = 0; y < arr.GetLength(0); y++)
{
for(int x = 0; x < arr.GetLength(1); x++)
{
Console.Write($"{arr[y,x]} ");
}
Console.WriteLine();
}
// 결과 : 0 1 2
// 3 4 5
int[2, 3]일 때
GetLength(0) = 2
GetLength(1) = 3
int[][] a = new int[3][];
a[0] = new int[5];
a[1] = new int[2];
a[2] = new int[3];
for(int i = 0; i < a.GetLength(0); i++)
{
for(int j = 0; j < a[i].Length; j++)
{
Console.Write($"{a[i][j]} ");
}
Console.WriteLine();
}
// 결과 : 0 0 0 0 0
// 0 0
// 0 0 0
가변 배열 : 층마다 데이터의 수를 다르게 부여할 수 있다.
층의 수는 a.GetLength(0)로 구할 수 있고,
층마다 데이터의 수가 다르므로 a[i].Length로 해당 층의 데이터의 수를 구할 수 있다.
List
배열은 처음에 지정한 데이터의 수 만큼만 저장할 수 있지만,
List는 제한 없이 데이터를 추가할 수 있다.
List<int> list = new List<int>();
list.Add(1);
list.Add(2);
list.Add(3);
for(int i = 0; i < list.Count; i++)
{
Console.WriteLine(list[i]); // 1 2 3
}
foreach(int val in list)
{
Console.WriteLine(val); // 1 2 3
}
int형 list를 만들고 1, 2, 3을 삽입하고 출력하는 코드
Count를 이용해서 리스트의 길이를 알아낼 수 있다.
List<int> list = new List<int>();
list.Add(1);
list.Add(2);
list.Add(3);
list[1] = 10; // list : 1, 10, 3
list[5] = 10; // error
list에 데이터를 추가한 뒤에 그 값의 인덱스에는 접근할 수 있지만
아직 채워지지 않은 인덱스에 접근하는 것은 불가능하다.
List<int> list = new List<int>();
list.Add(1);
list.Add(2);
list.Add(3);
list.Insert(0, 10); // list : 10, 1, 2, 3
insert(인덱스, 숫자) 를 이용해서 원하는 위치에 데이터를 넣을 수도 있다.
list.Remove(10);
list.RemoveAt(0);
Remove(n) : 제일 처음 만난 n을 리스트에서 삭제한다.
RemoveAt(n) : 리스트의 n번 인덱스의 값을 삭제한다.
Remove(n)은 반환타입은 bool 타입이고, 삭제를 성공했다면 true, 실패했다면 false를 반환한다.
list.Clear();
Clear() : 리스트의 데이터를 전부 삭제한다.
Dictionary
배열이나 List로 Id를 저장했을 때, 특정 Id를 찾고싶다면 모든 원소들을 탐색해야 한다.
배열이나 List의 크기가 몇백만개가 된다면 시간이 굉장히 오래 걸릴 것이다.
하지만 Dictionary는 굉장히 빠르게 접근할 수 있다.
Dictionary<int, Monster> dic = new Dictionary<int, Monster>();
Dictionary<key, value> 에서 key값을 안다면 value를 굉장히 빠르게 찾을 수 있다.
class Monster
{
public Monster(int id) { this.id = id; }
public int id;
}
Dictionary<int, Monster> dic = new Dictionary<int, Monster>();
dic.Add(1, new Monster(1));
dic[2] = new Monster(2);
1번 아이디와 2번 아이디를 가진 몬스터를 Dictionary에 넣는 코드이다.
Dictionary<int, Monster> dic = new Dictionary<int, Monster>();
for(int i = 0; i < 100; i++)
{
dic.Add(i, new Monster(i));
}
Monster mon1;
Monster mon2;
bool found1 = dic.TryGetValue(200, out mon1);
bool found2 = dic.TryGetValue(50, out mon2);
TryGetValue를 이용하여 value를 추출할 수 있다. 만약 유효하지 않은 키값이면 out으로 null이 나오고 false를 반환한다.
코드에서 200번은 유효하지 않은 키값이기때문에 mon1은 null, found1은 false이다.
반면에, 50번은 유효하기때문에 mon2는 Id가 50인 몬스터로 할당되고, found2는 true이다.
dic.Remove(100);
dic.Clear();
Remove(key)를 이용하여 해당 key에 해당하는 값을 삭제할 수 있고,
Clear() 을 이용하여 Dictionary의 모든 값을 삭제할 수 있다.
'스터디 > C#' 카테고리의 다른 글
알아두면 유용한 기타 문법 (1) | 2021.11.09 |
---|---|
4일차 : 객체지향 여행 (1) | 2021.11.05 |
2일차 : 코드의 흐름 제어 (1) | 2021.11.02 |
1일차 : 데이터 갖고 놀기 (1) | 2021.11.01 |