본문 바로가기
인공지능/자료구조

배열(Arrays)

by hyunji00pj 2024. 10. 31.

배열

특징

배열은 같은 타입의 데이터를 여러개 나열한 선형 자료구조이다.
연속적인 메모리 공간에 순차적으로 데이터를 저장한다.
배열은 선언할 때 크기를 정하면, 그 크기로 고정이 된다.
선언된 값은 다시 배열을 선언하지 않으면 변경할 수 없다.

 

배열의 주소를 살펴보면, 한 칸마다 배열의 자료형의 크기를 가지고 있다.
예를 들어 배열의 자료형이 int라면, 배열 한 칸의 크기는 int(4byte)가 되는 것이다.

 

배열은 데이터를 나열하고 각 데이터를 인덱스에 대응하도록 구성한 자료구조이다

여기서 인덱스는 0부터 시작하며, 마지막 인덱스는 배열의 요소의 개수 - 1이다.

파이썬의 리스트 타입은 배열 기능을 제공한다

시간복잡도

인덱스를 알고 있다면, 인덱스에 접근하는 시간복잡도는 O(1)이다.
데이터를 배열에 삽입을 하려면 기존에 있는 데이터를 한 칸 shift 한 후 데이터를 넣어야 하기에 시간복잡도는 O(n)이 걸린다.
마찬가지로 배열에서 데이터를 삭제하는 작업 또한 삭제한 뒤, 나머지 데이터들을 한 칸 shift 해줘야 해서 삽입과 마찬가지로 시간복잡도가 O(n)이 걸리게 된다.

 

 

 

배열이 필요한 이유

  • 같은 종류의 데이터를 효율적으로 관리하기 위해 사용
  • 같은 종류의 데이터를 순차적으로 저장
  • 빠른 접근이 가능(인덱스 번호로 접근)
 

장점

  • 구현이 쉽다.
  • 참조를 위한 추가적인 메모리가 필요하지 않는다.
  • 연속적이므로 메모리 관리가 편하다.
  • 인덱스를 통해 접근하므로 검색이 빠르다.

단점

  • 미리 최대 길이를 설정해야 함
  • 데이터의 추가 / 삭제가 어려움
# 1차원 배열: 리스트로 구현
arr = [1, 2, 3, 4, 5]
print(arr)
[1, 2, 3, 4, 5]
# 2차원 배열: 리스트로 구현
arr = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print(arr)
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print(arr[0])
print(arr[0][1])
[1, 2, 3]
2

 

배열의 응용

문제

아래 data 배열에서 전체 이름안에 'M' 알파벳이 몇 번 출현하는지 빈도수를 출력해보자

data = ['Braund, Mr. Owen Harris',
'Cumings, Mrs. John Bradley (Florence Briggs Thayer)',
'Heikkinen, Miss. Laina',
'Futrelle, Mrs. Jacques Heath (Lily May Peel)',
'Allen, Mr. William Henry',
'Moran, Mr. James',
'McCarthy, Mr. Timothy J',
'Palsson, Master. Gosta Leonard',
'Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg)',
'Nasser, Mrs. Nicholas (Adele Achem)',
'Sandstrom, Miss. Marguerite Rut',
'Bonnell, Miss. Elizabeth',
'Saundercock, Mr. William Henry',
'Andersson, Mr. Anders Johan',
'Vestrom, Miss. Hulda Amanda Adolfina',
'Hewlett, Mrs. (Mary D Kingcome) ',
'Rice, Master. Eugene',
'Williams, Mr. Charles Eugene',
'Vander Planke, Mrs. Julius (Emelia Maria Vandemoortele)',
'Masselmani, Mrs. Fatima',
'Fynney, Mr. Joseph J',
'Beesley, Mr. Lawrence',
'McGowan, Miss. Anna "Annie"',
'Sloper, Mr. William Thompson',
'Palsson, Miss. Torborg Danira',
'Asplund, Mrs. Carl Oscar (Selma Augusta Emilia Johansson)',
'Emir, Mr. Farred Chehab',
'Fortune, Mr. Charles Alexander',
'Dwyer, Miss. Ellen "Nellie"',
'Todoroff, Mr. Lalio']
data = ['Braund, Mr. Owen Harris',
'Cumings, Mrs. John Bradley (Florence Briggs Thayer)',
'Heikkinen, Miss. Laina',
'Futrelle, Mrs. Jacques Heath (Lily May Peel)',
'Allen, Mr. William Henry',
'Moran, Mr. James',
'McCarthy, Mr. Timothy J',
'Palsson, Master. Gosta Leonard',
'Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg)',
'Nasser, Mrs. Nicholas (Adele Achem)',
'Sandstrom, Miss. Marguerite Rut',
'Bonnell, Miss. Elizabeth',
'Saundercock, Mr. William Henry',
'Andersson, Mr. Anders Johan',
'Vestrom, Miss. Hulda Amanda Adolfina',
'Hewlett, Mrs. (Mary D Kingcome) ',
'Rice, Master. Eugene',
'Williams, Mr. Charles Eugene',
'Vander Planke, Mrs. Julius (Emelia Maria Vandemoortele)',
'Masselmani, Mrs. Fatima',
'Fynney, Mr. Joseph J',
'Beesley, Mr. Lawrence',
'McGowan, Miss. Anna "Annie"',
'Sloper, Mr. William Thompson',
'Palsson, Miss. Torborg Danira',
'Asplund, Mrs. Carl Oscar (Selma Augusta Emilia Johansson)',
'Emir, Mr. Farred Chehab',
'Fortune, Mr. Charles Alexander',
'Dwyer, Miss. Ellen "Nellie"',
'Todoroff, Mr. Lalio']

배열  data의 각 요소는 문자열이며, 이 문자열은 개인의 이름과 부가 정보들이 포함되어있다.

m_count = 0

for d in data:
    # print(d)
    for index in range(len(d)): # Braund, Mr. Owen Harris
        if d[index] == 'M':
            m_count += 1

print(m_count)

배열의 각 요소에 for d in data: 루프를 통해 차례로 한단어씩 접근한다.

 

알파벳 'M'만을 count하기 위해서는 요소의 문자를 한 글자씩 접근해야한다.

이를 위해서 내부 루프 for index in range(len(d))를 통해서

문자열 d의 길이만큼 반복하며 문자열 내의 각 문자를 index로 하나씩 참조한다.

 

배열의 각 문자열에서 'M' 문자를 찾기 위해 if d[index] == 'M': 조건문을 사용하여

만약 조건이 일치하다면 m_count 변수에 +1을 해준다

38

이를 통해 print()문으로 m_count를 출력한다면 38이 출력된다.

 

배열에서 각 요소(문자열)를 반복적으로 검사하면서 특정 문자의 빈도를 세는 것은 배열의 각 요소에 순차적으로 접근하고 처리해야 하는 대표적인 사례이다.

'인공지능 > 자료구조' 카테고리의 다른 글

자료구조란?  (0) 2024.10.29