자료구조와 알고리즘/자료구조

[C# 자료구조] 동적 배열(List: C++vector와 유사함) 구현

Rainbow🌈Coder 2022. 2. 4. 11:01
728x90

Board 클래스 안에서 List를 써보고,

그 List의 동적 배열 로직을 직접 구현하는 코드

 

List

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Algorithm
{
    class Board
    {
        public int[] _data = new int[25]; //배열
        public List<int> _data2 = new List<int>(); //동적 배열
        public LinkedList<int> _data3 = new LinkedList<int>(); //(이중)연결 리스트
        public void Initialize()
        {
            _data2.Add(101);
            _data2.Add(102);
            _data2.Add(103);
            _data2.Add(104);
            _data2.Add(105);

            int temp = _data2[2];
            _data2.RemoveAt(2); //인덱스 2번째 데이터를 삭제하라.
        }
    }
}

구현한 동적 배열

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Algorithm
{
    class MyList<T>
    {
        const int DEFAULT_SIZE = 1;
        T[] _data = new T[DEFAULT_SIZE];
        public int Count = 0; //실제로 사용중인 데이터 개수
        public int Capacity { get { return _data.Length; } }
        public void Add(T item)
        {
            //1. 먼저 공간이 충분히 남아 있는지 확인한다.
            if(Count>= Capacity)
            {
                //공간을 다시 늘려서 확보한다.
                T[] newArray = new T[Count * 2];
                for (int i = 0; i < Count; i++)
                    newArray[i] = _data[i];
                _data = newArray;
            }
            //2. 공간에 데이터를 넣어준다.
            _data[Count] = item;
            Count++;
        }

        public T this[int index]
        {
            get { return _data[index]; }
            set { _data[index] = value; }
        }

        public void RemoveAt(int index)
        {
            for (int i = index; i < Count - 1; i++)
                _data[i] = _data[i + 1];
            _data[Count - 1] = default(T);
            Count--;
        }

    }
    class Board
    {
        public int[] _data = new int[25]; //배열
        public MyList<int> _data2 = new MyList<int>(); //동적 배열
        public LinkedList<int> _data3 = new LinkedList<int>(); //(이중)연결 리스트
        public void Initialize()
        {
            _data2.Add(101);
            _data2.Add(102);
            _data2.Add(103);
            _data2.Add(104);
            _data2.Add(105);

            int temp = _data2[2];
            _data2.RemoveAt(2); //인덱스 2번째 데이터를 삭제하라.
        }
    }
}

    class MyList<T>
    {
        const int DEFAULT_SIZE = 1;
        T[] _data = new T[DEFAULT_SIZE];
        public int Count = 0; //실제로 사용중인 데이터 개수
        public int Capacity { get { return _data.Length; } } //Capacity는 2배씩 늘도록 설정
        public void Add(T item)
        {
            //1. 먼저 공간이 충분히 남아 있는지 확인한다.
            if(Count>= Capacity)
            {
                //공간을 다시 늘려서 확보한다.
                T[] newArray = new T[Count * 2];
                for (int i = 0; i < Count; i++)
                    newArray[i] = _data[i];
                _data = newArray;
            }
            //2. 공간에 데이터를 넣어준다.
            _data[Count] = item;
            Count++;
        }

        public T this[int index]
        {
            get { return _data[index]; }
            set { _data[index] = value; }
        }

        public void RemoveAt(int index)
        {
            for (int i = index; i < Count - 1; i++)
                _data[i] = _data[i + 1];
            _data[Count - 1] = default(T);
            Count--;
        }

    }


 

 

Main(중요 x)

using System;

namespace Algorithm
{
    class Program
    {
        static void Main(string[] args)
        {
            Board board = new Board();
            board.Initialize();
            Console.CursorVisible = false;
            const int WAIT_TICK = 1000 / 30;
            const char CIRCLE = '\u25cf';
            int lastTick = 0;
            while(true)
            {
                #region 프레임 관리
                //만약에 경과한 시간이 1/30초 보다 작다면
                int currentTick = System.Environment.TickCount;
                if (currentTick - lastTick < WAIT_TICK) continue;
                lastTick = currentTick;
                #endregion
                //입력

                //로직

                //렌더링
                Console.SetCursorPosition(0, 0);
                for(int i=0; i<25; i++)
                {
                    for(int j=0; j<25; j++)
                    {
                        Console.ForegroundColor = ConsoleColor.Green;
                        Console.Write(CIRCLE);
                    }
                    Console.WriteLine();
                }
            }

        }
    }
}
728x90