[자료구조] Array(배열)



1. 자료구조(Data Structure) : 배열(Array)


우리는 너무나 당연하게 배열을 사용하고 이용하고 활용합니다.


사실 기술면접에서 배열에 대해 설명해 주세요. 라는 말은 하지 않겠지만.. 알고 있긴 해야겠죠?

컴공을 전공하지 않고 따로 컴공을 배우지 않은 상태에서 Array에 대해서 설명하라고 하면.. 

"아.. 배열이 어레이고, 어레이가 배열인데 그걸 뭘 더 어떻게 설명하지?..." 라고 생각 하실 수 도 있습니다. 우리가 생각하는 자바스크립트나 파이썬의 배열과 처음에 컴퓨터공학을 전공하는 사람은 C 배열부터 배우니까요..  


면접용 한마디 짜리 답: 

(한글) 데이터를 나열하고 인덱스에 대응하도록 만들어진 데이터 구조 

(영어) The data structure to list data which are identified by at least one array index or key 


우선 배열은 파이썬에서 쓰는 list() 입니다. 하지만, 엄밀히 말하면 이 list 가 배열의 기능을 제공하는 것이지 기본적인 배열의 의미와 기능보다 list가 훨씬 방대하고 편리한 기능을 제공하기 때문에 배열을 설명하라고 했는데 리스트를 설명하고 있으면 안됩니다. 

우선 배열은 아래와 같이 생겼습니다.

lst = [13,54,76,78,89]
print(lst[3]) # 78
print(lst[2]) # 76
print(lst[-1]) # 89

다들 아시지요?

위와 같이 인덱스에 대응하기 때문에 내가 찾고자 하는 자료가 몇번 인덱스에 있는지 또는 몇번째 인덱스에 대응하는 데이터를 꺼내올지를 매우 빠르게 가지고 올 수 있습니다. 


우선 같은 데이터 타입을 넣기위한 자료구조 입니다. 위 처럼 숫자만 들어가거나 또는 문자만 들어가거나 하고, 섞여 들어가지 않습니다. 파이썬에서는 lst.pop(), lst.append, . extend, .sort, .count 등등등 수많은 기능을 제공하여 편하게 늘렸다 줄였다 넣었다 뺐다 해왔지만, 데이터 추가 삭제시 데이터를 앞 뒤로 땡겨야 하거나, 배열 사이즈를 변경하는 등의 추가 리소스를 사용합니다. 또한, 내가 사용할 배열 공간을 미리 예측해서 만들어 내야 하거나 사용하지 않아도 공간을 미리 확보해 두어야 한다는 불편함이 있지요. 변경하면 추가 리소스를 사용하니까요.


2. 시간복잡도

배열의 Big-O 시간복잡도는 O(1) 입니다. 그냥 인덱스만 알면 한방에 뭐가 어디 있는지 찾을 수 있으니까요.


3. 리스트 조건제시식(List Comprehension)

파이썬에서는 리스트 조건제시식, List Comprehension 이라는 것을 지원합니다.

아래와 같이 사용 가능합니다.

lst = [13,54,76,78,89]
>> [13, 54, 76, 78, 89]
list_2 = [x
for x in lst] >> [13, 54, 76, 78, 89]
list_3 = [y for y in range(0, 10)] >> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
list_4 = [-x for x in lst] >> [-13, -54, -76, -78, -89]
list_5 = [[0 for x in range(4)] for y in range(3)] >> [ [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0] ]

2차 배열을 만드는 방법은 추후 다이나믹 프로그래밍 등에서 쓰이는 메모이제이션의 맵 등을 그릴때 매우 유용합니다.

일반적으로 map이나 list comprehension은 for-loop 바이트 코드를 통해 순차적으로 실행하는 것보다 빠를 수 있습니다. 인터프리터 내의 C언으로 실행되기 때문입니다. 하지만, 중첩되거나 자주 사용되면 가독성이 떨어집니다. 좋은 프로그래밍은 단순한 프로그래밍입니다.


4. 키포인트

  1. 배열은 빠르다.
  2. 같은 데이터 타입을 위한 자료구조이다.
  3. 데이터 추가 삭제시 추가 리소스가 요구된다.
  4. 미리 공간할당을 해두어야 한다.



  • [[a.original_name]] ([[a.file_size | fileSizer]])
좋아요[[ postLike | likePlus ]]
공유
라이언

“Lead Python Engineer”

댓글 [[totalCommentCount]]
[[ comment.author__nick_name ]] [[ comment.datetime_updated | formatDate]] (수정됨)

[블라인드 처리된 글 입니다.]

답장
[[ sub.author__nick_name ]] [[ sub.datetime_created | formatDate ]] (수정됨)

취소
댓글을 남겨주세요.
'컴퓨터공학' 관련 최신 포스트
[[ post.title ]]
[[ post.datetime_published_from | DateOnly ]]