Algorithm&BAEKJOON(백준)/0. 알고리즘(Algorithm), 자료구조(Data Structure)

[알고리즘(Algorithm)] 3. 배열(Array)과 리스트(List)

JE_:) 2023. 4. 14. 15:08
728x90

 

 

기본 *자료구조인 배열(array)과 리스트(list)는 가장 흔히 사용되는 자료구조이다. 하지만 이 둘은 비슷하면서도 분명한 

차이점을 가지고 있기에, 이에 대한 이해가 필요하다.

 

 

 

* 자료구조(Data Structure)

더보기

컴퓨터가 데이터를 효율적으로 다룰 수 있게 도와주는 데이터 보관에 대한 방법과 연산의 총체를 말한다.

 

예를 들면 자주 사용하는 데이터 타입인 int도 자료구조이다.

 

 

* int의 보관 방법 및 연산

보관 방법 32bit 메모리 공간 안에 수를 할당하되, 첫 비트를 부호 표현에 사용한다.
연산 덧셈(+), 뺄셈(-), 나눗셈(/, %), 곱셈(*), 논리(&&, ||, &, |, ^, !), 시프트(<<, >>) 등의 다양한 연산 제공

 

자료구조의 구성

자료구조는 단순 자료구조(Primitive Data Structure, 또는 기본형)와 복합 자료구조(Non-Primitive Data Structure)로 나뉜다.

 

또 복합 자료구조는 선형 자료구조(Linear Data Structure)와 비선형 자료구조(Non-Linear Data Structure)로 나뉜다.

이때, 오늘 학습하고자 하는 배열과 리스트는 선형 자료구조에 해당 된다.

 

 

[ 참고 및 출처 : 한빛출판네트워크 - 개발자는 반드시 자료구조와 알고리즘을 배워야 할까? ]

 

 

 

 


 

 

 

※ 배열(Array)

 

동일한 자료형(Data Type)의 데이터를 연속된 공간에 값을 채워넣는 형태의 자료구조이다.

인덱스(Index)를 통해 참조(Reference) 가능하다는 특징이 있다.

 

배열의 구조

 

// Java에서의 배열 선언

	// 선언시,  데이터 생성
	// (1) 자료형[] 변수 = {값1, 값2, 값3 ... };   
	String[] arr = {"가", "나", "다", "라", "마", "바"};
    
    
    // 선언 후, 데이터 삽입
    // (2) 자료형 [] 변수 = new 자료형[배열 크기];
    String[] arr = new String[6]; //크기가 6인 배열 생성
    // index를 통해 접근함.
    arr[0] = "가"; 
    arr[1] = "나";
    arr[2] = "다";
    arr[3] = "라";
    arr[4] = "마";
    arr[5] = "바";

 

 

* 배열의 특징

① 인덱스(index)를 사용하여 값에 접근할 수 있다.

 

② 새로운 값을 삽입하거나 특정 인덱스에 있는 값을 삭제하기 어렵다.

     삽입 / 삭제시, 해당 인덱스 주변에 있는 데이터를 이동시키는 과정이 필요하다. (번거로움)

③ 배열의 크기는 선언할 때 지정할 수 있으며, 변경할 수 없다. (불변성)

 

④ 구조가 간단하여 코딩 테스트 및 실무에서 많이 사용된다. 

 

⑤ 같은 종류의 변수만 선언 가능하다. (같은 데이터 타입의 모음)

 

 

 

 

 


 

 

※ 리스트(List)

 

값과 포인터(pointer)를 묶은 노드(node)를 포인터로 연결한 자료구조이다.

이는 배열이 가지고 있는 인덱스(index)라는 장점을 버림으로써, 데이터를 빈틈없이 채우고 활용하는 장점을 가져왔다.

 

 

 

* 배열의 메모리 낭비?

더보기

배열의 가장 큰 특징은 인덱스(index) 구조이다. 이러한 인덱스를 알고 있다면, 데이터를 매우 빠르고 쉽게 가져올 수 있다. 하지만 배열에는 분명한 단점이 있다. 이는, 데이터에 인덱스의 값이 고정되어 있어야 한다는 것이다. 

 

즉,  arr[0] 이 5라면, 데이터(5)에 인덱스([0])값이 고정되어 있다는 것이다. 이러한 구조는 삭제시에 해당 공간을

빈공간으로 남겨둬야 하기에 메모리의 낭비를 초래할 수 밖에 없다. 

 

리스트 구조

 

	// List 선언 
	List<String> list1 = new ArrayList<>(100);
    List<String> list2 = new ArrayList<>();
    ArrayList<String> list3 = new ArrayList<>();

 

 

 

* 리스트(List) 특징

① 인덱스(Index)가 없으므로 값에 접근하려면 Head -> Tail 포인터 순서대로 접근하여야 한다. (속도가 느리다.)

 

② 포인터로 연결되어 있어, 데이터를 삽입하거나 삭제하는 연산 속도가 빠르다.

 

③ 크기가 별도로 정해져있지 않으며, 크기가 변하는 데이터를 다룰 수 있다.

 

④ 포인터를 저장할 공간 또한 필요하므로, 배열보다 구조가 복잡하다.

 

 

 

 

 

* 해당 포스팅은 Infrean의 [ 하루코딩 - Do it! 알고리즘 코딩테스트 with java ]를 참고해 작성하였습니다.

728x90