본문 바로가기

코딩/Algorithm, 자료구조

[Python/파이썬] 자료구조 - 배열(Array)

반응형

 

   자료구조는 대량의 데이터를 효율적으로 관리할 수 있는 데이터 구조를 의미한다. 자료구조의 대표적인 예는 학교 학생 관리나 회사의 직원 관리를 예로 들 수 있을 것 같다. 회사에서 직원들을 관리하는 데이터를 생각해볼 수 있다. 어떤 회사의 직원이라면 무조건 사번이 부여된다. 어떤 직군인가에 따라 부여되는 코드도 달라지고 자신의 직급, 팀 등으로 분리하여 관리된다. 데이터를 관리할 때 어떤 구조로 관리하느냐에 따라 효율이 달라진다고 하니 SW를 개발하는데 있어서 매우 중요한 부분이다.

 

  대표적인 자료구조에는 배열, 스택, 큐, 연결리스트, 해쉬 테이블, 힙 등이 존재한다. 앞으로 대표적인 자료구조에 대한 공부를 하려고 한다. 파이썬이 가장 쉽고 빠르게 자료구조와 알고리즘을 익힐 수 있다고 하니 비전공자 입장에서는 파이썬을 배우는 것이 좋을 것 같다.

 

 

1. 배열(Array)

 

  같은 종류의 데이터를 효율적으로 관리하기 위해 사용하는 개념이다.  아래 이미지는 배열의 기본 구조이다. 파이썬의 배열은 리스트 , 튜플과 같은 자료형에 해당된다. 보통 배열은 같은 데이터타입들의 원소로만 이루어지지만 파이썬은 다른 데이터 타입이어도 한 배열에 담을 수 있다.

 

 

1) 배열의 장점 

 

  인덱스를 통해 빠른 접근이 가능하다. 나중에 시간 복잡도(Big-O : 프로그램의 실행시간을 나타내는 표기법)를 통해 배울 예정이지만, 인덱스를 통한 조회는 시간복잡도가 O(1)이다. O(1)이란 의미는 입력과 상관없이 속도가 항상 일정하다는 것을 의미.

 

2) 배열의 단점

 

  미리 배열의 최대 크기를 정해놔야 해서 데이터 추가/삭제가 어렵다.(C, C++에 해당되는 이야기 같다. 파이썬에는 해당 안됨)

 

 

 

2. 파이썬과 배열(Array)

 

  위에서 언급하였지만 파이썬에서는 리스트, 튜플과 같은 자료형을 통해 배열을 사용할 수 있다. 파이썬에서는 배열의 최대길이를 지정하지 않기 때문에 데이터 추가/삭제시 편리하다. 아래 예시코드를 하나 작성해보았다.

 

<예시 코드>

country = 'TWO HAND' 
print (country)

country = country +' PLACE'
print(country)

 

<결과>

TWO HAND
TWO HAND PLACE

 

  파이썬에서는 문자열의 각 문자도 배열의 각 요소로 볼 수 있다. 파이썬에서는 배열의 크기를 지정하지 않는데 위 예시에서 보면 'TWO HAND'라는 문자열에 'PLACE'를 쉽게 이어 붙일 수 있다. C, C++의 경우 배열의 크기를 정해놓기에 이러한 배열의 가공이 어렵다.  아래는 지금 내가 보고 있는 강의에서 예시로 준 문제인데, 내가 조금 바꿔서 작성해보았다.

 

 

 

예시 문제) 아래 dataset 리스트에서 전체 이름 안에 'a'가 몇번나왔는지 출력하기

 

#dataset
dataset = ["abcabc", "bbab", "cccc", "abaaa", "bdfad"]

 

위 dataset에서 a의 개수를 찾기 위해 내가 풀이한 방법, 강의에서 알려준 방법 2가지를 정리해보려고 한다.

 

 

case1) 문자열의 count 함수 이용

 

  파이썬의 배열(리스트)를 사용하는 장점 중 하나는 다양한 내장함수들이 있다는 것이다. 그 중 하나는 count이다.

 

<코드>

dataset = ["abcabc", "bbab", "cccc", "abaaa", "bdfad"]

total = 0

for data in dataset:
    count = data.count('a')
    total = total + count

print ('a의 개수는', total)

 

<결과>

a의 개수는 8

 

  리스트의 각 요소를 for 문(loop)를 통해 각 문자열의 특정 문자('a') 개수를 구한다. 그 다음 total에 누적 합산하는 방식이다. 만약 리스트 함수를 사용하지 못한다는 전제조건이 있다면 아래와 같이 하면 된다.

 

 

case2) 강의에서 나온 방법 - 2차원 배열로 생각하여 풀기

 

<코드>

dataset = ["abcabc", "bbab", "cccc", "abaaa", "bdfad"]

total = 0

for data in dataset:
    for index in range(len(data)):
        if data[index] == 'a':
            total += 1
            
print ('a의 개수는', total)

 

<결과>

a의 개수는 8

 

  case1과 리스트를 통해 loop를 도는 부분은 같다. 다른 점은 각 문자열 요소의 길이를 구해서 문자열도 하나의 배열로 보았다는 점이다. 아래 그림처럼 각 5개의 row(행)을 가진 2차원 배열이라고 생각하면 될 것 같다.

 

 


※ 참고자료 :  패스트 캠퍼스 - 알고리즘 / 기술면접 완전 정복 올인원 패키지 Online. 

자료구조 - 배열편

https://fastcampus.co.kr/dev_online_algo

 

728x90