티스토리 뷰

알고리즘

[자료구조 - Python] 배열

HAN_PY 2023. 6. 16. 20:00
반응형

자료구조의 첫 번째 정리할 부분은 배열이다. 배열은 사실 우리가 사용 중인 파이썬의 list라고도 할 수 있겠다. 그렇다면 파이썬의 list와 자료구조의 배열은 완전히 같은 개념이라고 할 수 있을까? 배열에 대해 간단히 알아보고 코딩으로 체득하도록 해보자.

 


 

자료구조의 배열이란

일반적인 자료구조에서의 배열이란, 순서를 가진 데이터의 집합을 가리키는 추상 자료형(abstract data type)이다. 즉, 순서를 가진 데이터 집합을 모두 배열이라고 할 수 있다. 배열을 종류는 크게 2가지로 나뉜다.

 

- 순차 리스트: 저장소를 배열형태로 만드는 것. 연속적인 메모리 공간에 저장(python에서 list)

- 연결 리스트: 저장 할때 마다 메모리를 확보해서 추가시키는 . 메모리의 동적할당을 기반으로 구현

 

일반적으로 우리가 배열이라고 사용하는 파이썬의 list는 순차 리스트라고 할 수 있다. 연결 리스트는 다른 페이지로 따로 정리를 할 예정이고, 여기서는 순차 리스트에 대해 조금 더 알아보고자 한다.

 

순차 리스트(Sequential List)

순차 리스트는 구현할 자료들을 논리적인 연속적인 메모리에 저장하는 자료구조이다.  따라서 자료의 논리적인 구조와 물리적인 구조가 일치한다고 할 수 있다. 우선 아래의 코드를 보자.

 

list_test = [3, 7, 12, 45]
print(list_test[1]) # 7

 

우리는 기본적으로 순차 리스트는 연속적 메모리에 배열이 저장된다고 배웠다. 위의 배열에서 첫 번째 값인 3을 가져오기 위해서는 배열의 시작 주소로 접근을 해서 리스트의 첫번째 데이터를 가지고 올 수 있는 것이다. 만약 메모리 크기가 배열당 4byte라면, 더하기를 통해 각각 인덱스의 값을 가져오는 것이 가능하다. 즉, 인덱스 0이면 시작 주소가 되는 것이고, 시작 주소에 바로 첫번째 값이 저장 되어 있기 때문에 인텍스 0으로 첫번째 데이터를 가져온다고 있다.

 


iterable (이터러블)

iterable 객체의 구조는 원소를 하나씩 꺼내는 구조이다. iterable 한 자료형 객체에는 리스트, 튜플, 딕셔너리, 문자열 등이 있다. 배열을 배우는 입장에서 관련된 중요한 개념이 있어 가져왔다. 우선은 아래의 코드 예시를 보자.

 

iter_x = iter([1,2,3,4,5])
while True:
    try:
        print(next(iter_x))
    except:
        raise

 

파이썬 내장함수인 iter()에 이터러블 객체를 넣으면, 객체에 대한 iterator를 반환한다. 이때 next 함수를 호출하거나 next() 내장 함수로 원소를 순차적으로 꺼낼 수 있다. 따라서 위의 next(iter_x) iter_x.iter_x.next()와 동일하다. 또한 만약 꺼낼 원소가 없으면 StopIteration 예외를 발생시킨다.

 


 

배열 알고리즘 실습

사실 알고리즘/자료구조 공부 시 항상 가장 강조하는 것은 기본적인 코딩 실력이 있어야 한다는 것이다. 따라서 아래의 간단한 실습 정도는 반드시 할 수 있어야 한다.

 

최대 최소 구하기

풀이 1

def max_fuc(data):
    max_val = data[0]
    for i in range(1, len(data)):
        if data[i] > max_val:
            max_val = data[i]
    return max_val

 

위 풀이는 가장 간단한 최댓값 구하는 문제라고 할 수 있다. 배열을 for문으로 돌면서 max_val 변수보다 큰 변수가 있다면, max_val 변수로 변경을 해주면서 최대값을 구한다.

 

 

풀이 2

max([1, 3, 5, 2, 10]) # 10

 

사실 최대값 최솟값을 구하는 가장 쉬운 방법은 위와 같은 라이브러리를 사용해서 max(), min() 값을 구하는 것이다. 하지만, 최대/최소 구하는 방식은 로직의 가장 기초 부분이라 할 수 있게 때문에 코딩으로도 구현할 있어야 한다

 

 

enumerate 사용해 보기

 

data = ['python', 'java', 'C']

for index, value in enumerate(x):
    print(f`{index}번째 값은 {value}입니다`)

 

enumerate 내장 함수는 많이 사용하는 함수 중에 하나이다. 특징으로는 기존의 For문은 value값 하나만 준다면, index값과 value값을 동시에 받아서 사용이 가능하다고 할 수 있다. 배열의 원소의 위치를 같이 알 수 있기 때문에 매우 유용하다고 할 수 있다.

 

 

배열을 역순으로 정렬하기 1 (짝수 / 홀수 나누어 생각하기)

 

풀이 1

data = [1, 2, 3, 4, 5]
cnt = len(data)
for i in range(cnt // 2):
    data[i], data[cnt - i - 1] = data[cnt - i - 1], data[i]

 

위의 코딩에서 중점적으로 보아야 하는 부분은 // 부분과 자리 변경 부분이다. 관련 내용은 어렵지 않기 때문에 넘어가도록 하겠다.

 

 

 

배열을 역순으로 정렬하기 2 (reverse())

풀이 1

data = [1, 2, 3, 4, 5]
data.reverse()
print(data)

 

reverse() 메서드를 활용하는 방법으로 암기해 두면 좋다.

 

 

배열을 역순으로 정렬하기 3 (reversed())

풀이 1

data = [1, 2, 3, 4, 5]
data = list(reversed(data))
print(data)

 

reversed() 내장함수를 활용하는 방법으로 암기해 두면 좋다. 위의 reverse()와 reversed()의 차이점을 확인하자. reversed() 함수는 x 원소를 역순으로 정렬해주는 iterable 객체를 생성한다. , data 역순으로 iterator를 꺼녀서 반환하는 것이다. 따라서 위의 코드 처럼 반환된 iterable 객체를 list() 함수에 다시 넘겨 새로운 리스트 생성을 해야한다.

 


 

마무리

효율적인 데이터 관리를 위해 우리는 자료구조에 종류에 대해 배우고 있다. 그중 순차 리스트는 연속적인 메모리로 1차원 배열에 순차적으로 항목들이 저장이 된다. 이러한 자료구조의 가장 기본이자 기초라 할 수 있는 순차 리스트에 대한 코딩 숙련도는 필수 역량이라 할 수 있다. 배열을 보았으니 이제 다른 자료구조도 한번 같이 알아보자.

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함