내일배움캠프 TIL

내일배움캠프 12일차 TIL "딕셔너리, 스택, 큐"

Jooglorystar 2024. 9. 27. 21:23

 

 

 

11일차에는 배열과 리스트에 대해 공부했었다.

배열과 리스트는 비슷하지만, 서로 다른 점이 있고, 용도에 따라 잘 선택해 사용할 필요가 있다.

 

그 외에도 여러 변수들을 저장할 수 있는 컬렉션들이 있다.

 

오늘은 딕셔너리(Dictionary), 스택(Stack), 큐(Queue) 에 대해 공부할 것이다.

 

 

1. Dictionary

public static void Main(string[] args)
{
    Dictionary<string, int> ages = new Dictionary<string, int>();

    ages.Add("철수", 20);
    ages.Add("영희", 23);
    ages.Add("바둑이", 3);

    foreach (KeyValuePair<string, int> pair in ages)
    {
        Console.WriteLine($"{pair.Key}: {pair.Value}");
    }
    
    for(int i = 0; i < ages.Count ; i++)
    {
        KeyValuePair<string, int> pair = ages.ElementAt(i);
        Console.WriteLine($"{pair.Key}: {pair.Value}");
    }
}

 

딕셔너리는 'key'와 'value'의 값을 가진 컬렉션이다.

앞의 값이 ' key '이고 뒤의 값이 'value'이다. 

리스트와 같이 Add로 출력할 수 있고, Remove로 데이터를 제거할 수 있다.

 

만약 변수 값으로 key나 value값을 가지고 싶다면 위 예시코드의

KeyValuePair<string, int> pair = ages.ElementAt(i);

처럼, ElementAt() 함수로 받을 수 있다.

 

딕셔터리에서는 중복된 키를 입력할 수 없다.

 

 

위의 예시코드는 <string, int>로 선언했지만, 밑의 예시코드처럼 Key를 int, Value를 string 으로 선언하는 것도 가능하다. 

public static void Main(string[] args)
{
    Dictionary<int, string> ages = new Dictionary<int, string>();

    ages.Add(20, "철수");
    ages.Add(23, "영희");
    ages.Add(3, "바둑이");

    foreach (KeyValuePair<int, string> pair in ages)
    {
        Console.WriteLine($"{pair.Key}: {pair.Value}");
    }
}

 

 

 

2. Stack

 

public static void Main(string[] args)
{
    Stack<int> stack = new Stack<int>();

    stack.Push(1);
    stack.Push(2);
    stack.Push(3);

    int peek1 = stack.Peek();
    int pop = stack.Pop();
    int peek2 = stack.Peek();

    Console.WriteLine("peek1: " +peek1);
    Console.WriteLine("pop: " + pop);
    Console.WriteLine("peek2: " + peek2);
}

 

 

리스트와 딕셔너리는, 중간값에 접근할 수 있었지만, 스택은 다소 특이하다.

우선 Push()를 이용하면 변수들을 저장할 수 있다.

Peek()을 통해 값을 불러올 수 있으며, 이 경우 스택에 변동점은 없지만,

Pop()을 할 경우 스택에서 가장 늦게 추가된 값이 제거된다.

예시코드에서는 제일 늦게 추가된 3이 pop 변수에 할당되고, peek2에는 3이 제거된 뒤기 때문에 2가 할당된 것을 확인할 수 있다.

비유하자면 상자에 물건을 차곡차곡 쌓고, 다시 순서대로 꺼내는 것이라고 할 수 있다.

이러한 방식을 후입선출이라고 한다.

 

 

4. Queue

public static void Main(string[] args)
{
    Queue<int> queue = new Queue<int>();

    queue.Enqueue(1);
    queue.Enqueue(2);
    queue.Enqueue(3);

    int peek = queue.Peek();

    int dequeue = queue.Dequeue();
    queue.Enqueue(4);

    Console.WriteLine($"peek: {peek}");
    Console.WriteLine($"dequeue: {dequeue}");
    Console.WriteLine("==========");

    for (int i = 0; queue.Count > 0; i++)
    {
        int num = queue.Dequeue();
        Console.WriteLine(num);
    }

}

 

Queue는 Stack과 반대로 먼저 들어간 것이 먼저 나오는 선입선출 방식의 자료구조이다.

예시코드에서는 1, 2, 3을 순서대로 Enqueue() 했고, 

Peek()을 통해 정수변수 peek에 제일 먼저 Enqueue된 1이 할당되고,

Dequeue()를 통해 정수변수 dequeue에 1이 들어갔다.

 

후에 queue의 길이만큼 Dequeue() 하니, 이미 Dequeue()되어 사라진 1빼고, 나머지 정수들이 모두 출력되었다.

 

Stack이나 Queue가 비어있을때, Peek으로 값을 할당하려 하거나, Pop이나 Dequeue를 이용해 값을 빼려고 하면 오류가 발생한다.