본문 바로가기

자료구조

동적배열의 축소

500

더보기
using System;
using System.Collections.Generic;

namespace HelloWorld
{
    public class App
    {
        int[] arr;
        int[] temp;

        //생성자
        public App()
        {
            arr = new int[2];
            //arr[3] = 5;   indexOutOfRange
            Console.Write("배열arr의 요소: ");
            for (int i = 0; i < this.arr.Length; i++)
            {
                Console.Write("{0} ", arr[i]);
            }
            Console.WriteLine();

            AddItem(3);
            AddItem(5);
            AddItem(11);
            Console.WriteLine();
            Console.WriteLine("3 요소 제거하기");
            Console.WriteLine();
            Subtract(3);
            Console.WriteLine();
            Console.WriteLine("5 요소 제거하기");
            Subtract(5);
        }

        void AddItem(int item)
        {
            int emptyIndex = -1; //빈방 인덱스 임시 저장공간 -1이면 못찾음

            //배열의 요소를 순회하며 빈공간 찾기
            //0 인덱스부터 배열의 길이 -1 (last index)까지
            //배열의 요소의 값을 확인한다 (값이 0인가?)
            //요소의 값이 0이라는 뜻은 비어있다 (약속)
            for (int i = 0; i < this.arr.Length; i++)
            {
                //Console.WriteLine(i);   //i값은 배열의 인덱스
                if (this.arr[i] == 0)
                {//빈방 찾았다
                    emptyIndex = i; //빈방 인덱스
                    break;
                }
            }
            //Console.WriteLine("emptyIndex: {0}", emptyIndex);

            if (emptyIndex == -1)
            {
                //full
                //기존배열의 길이보다 1개큰 임시 배열을 생성한다
                int[] temp = new int[this.arr.Length + 1];
                //기존 배열을 순회 하며 임시배열에 순서대로 넣어준다
                for (int i = 0; i < this.arr.Length; i++)
                {
                    temp[i] = this.arr[i];
                }
                //값복사 완료
                //기존 배열을 임시배열로 교체한다
                this.arr = temp;

                //배열의 끝에 요소의 값을 넣는다
                this.arr[this.arr.Length - 1] = item;
            }
            else
            {
                //인덱스에 요소를 할당한다
                this.arr[emptyIndex] = item;
            }

            Console.Write("추가: {0} : ", item);
            for (int i = 0; i < this.arr.Length; i++)
            {
                Console.Write("{0} ", this.arr[i]);
            }
            Console.WriteLine();
        }

        void Subtract(int item)
        {
            int findIndex = -1;
            int emptyIndex = -1;
            //배열의 요소를 순회하며 해당 아이템 찾기
            for (int i = 0; i < this.arr.Length; i++)
            {
                if (this.arr[i] == item)
                {//찾았다
                    findIndex = this.arr[i];
                    this.arr[i] = 0;    //해당 인덱스 비우기
                    break;
                }
            }

            if (findIndex == item)
            {
                
                
                while (this.arr[this.arr.Length - 1] != 0)
                {
                    for (int i = 0; i < this.arr.Length; i++)
                    {
                        if (this.arr[i] == 0)
                        {//빈방 찾았다
                            emptyIndex = i; //빈방 인덱스
                            break;
                        }
                    }
                    this.arr[emptyIndex] = this.arr[emptyIndex + 1];
                    this.arr[emptyIndex + 1] = 0;
                    Console.Write("요소자리바꾸기: ");
                    for (int i = 0; i < this.arr.Length; i++)
                    {
                        Console.Write("{0} ", this.arr[i]);
                    }
                    Console.WriteLine();
                }
                temp = this.arr;
                this.arr = new int[this.arr.Length - 1];
                for (int i = 0; i < this.arr.Length; i++)
                {
                    this.arr[i] = temp[i];
                }
            }

            Console.Write("빈 인덱스 제거하고 요소출력: ");
            for (int i = 0; i < this.arr.Length; i++)
            {
                Console.Write("{0} ", this.arr[i]);
            }
            Console.WriteLine();
        }
    }
}

 

'자료구조' 카테고리의 다른 글

Node  (0) 2021.12.28
동적배열로 인벤토리 만들기  (0) 2021.12.28
동적 배열 (Dynamic Array)  (0) 2021.12.28
Jagged Array (가변배열)  (0) 2021.12.28
Dictionary + 인벤토리  (0) 2021.12.26