Priv's Blog
3. 자료구조와 배열 본문
1. 자료구조 (Data Structure)
자료구조란, 데이터 단위와 데이터 자체 사이의 물리적 또는 논리적 관계로 이루어진 데이터 구성을 말한다.
컴퓨터에서 처리해야 하는 많은 데이터들을 효율적으로 관리, 구조화하는데 필요한 개념이다.
2. 학생 성적 분석 알고리즘
학생 5명의 시험 점수를 입력받아 합계, 평균을 구하는 알고리즘을 작성해보자.
사용자에게 입력받은 각 학생의 점수를 score 1, score 2, ~ , score n에 대입하고, 합계와 평균을 수식으로 계산한다.
print("학생 그룹 점수의 합계, 평균을 구하는 알고리즘")
## User Input ##
score1 = int(input("1번 학생 점수: "))
score2 = int(input("2번 학생 점수: "))
score3 = int(input("3번 학생 점수: "))
score4 = int(input("4번 학생 점수: "))
score5 = int(input("5번 학생 점수: "))
## -- ##
total = 0 ## total
total = score1 + score2 + score3 + score4 + score5
## Result ##
print(f"total: {total}")
print(f"Aver: {total / 5}")
## -- ##
위 코드처럼 프로그램을 하드 코딩하는 것은 별로 추천되지 않는 방법이다.
그럼 다음으로, 이 프로그램을 사용하는 고객이 다음과 같은 요구 사항 3가지를 주문했다고 가정해보자.
- 학생 수를 변경하는 경우
- 특정 학생의 시험 점수를 확인하거나 변경하는 경우
- 최저점과 최고점을 구하거나, 정렬 기능을 구현하는 경우
이러한 요구 사항들에 대응하려면 배열을 사용해야 한다.
3. 배열 (Array)
배열은 동일한 타입인 데이터들을 연속적인 순차적 묶음 단위로 메모리에 저장하는 자료구조를 의미한다.
배열은 여러 개의 원소(Element)들의 나열로 구성된다.
각 원소들은 0부터 시작하는 인덱스(Index)를 부여받아 자신의 위치를 표현할 수 있다.
3.1) python에서의 배열
python에서 배열을 사용할 때, 다른 언어들과 차별화되는 여러 가지 특징을 지니고 있다.
- 배열 원소로 서로 다른 자료형(int, float 등)을 함께 저장할 수 있다. (권장하지 않음)
- python에서는 배열을 원소로서 다른 배열에 저장할 수 있다. (리스트 안의 리스트)
- python에서는 배열의 원소에 접근할 때, 음의 정수를 인덱스로 사용할 수 있다.
이러한 특징들은 python 내에 존재하는 모든 요소들은 '객체 참조'를 기반으로 동작하기 때문이다.
3.2) python에서의 배열 구현 방법
python에서 배열을 구현하는 방법으로는 리스트(list)와 튜플(tuple)이 있다.
리스트 (List)는 원소를 변경할 수 있는 뮤터블(Mutable) 객체이다.
연산자 [ ] 안에 원소를 쉼표( , )로 구분하여 표기해 생성한다.
원소 없이 [ ]만 기입하면 빈 리스트가 생성된다.
내장 함수 list()를 사용하면, 문자열이나 튜플 등 다양한 자료형 객체를 원소로 하는 리스트를 생성할 수 있다.
list01 = [] ## 공백 리스트
list02 = [1, 2, 3] ## [1, 2, 3]
list03 = ['A', 'B', 'C'] ## ['A', 'B', 'C']
list04 = list() ## 공백 리스트
list05 = list('ABC') ## ['A', 'B', 'C']
list06 = list([1, 2, 3]) ## [1, 2, 3]
range() 함수와 조합하면 특정 범위의 정수로 구성된 리스트를 생성할 수 있다.
None을 사용하면 원소 값을 정하지 않고 크기만 정하여 리스트를 생성할 수 있다.
list09 = list(range(7)) ## [0, 1, 2, 3, 4, 5, 6]
list10 = list(range(3, 8)) ## [3, 4, 5, 6, 7]
list11 = list(range(3, 13, 2)) ## [3, 5, 7, 9, 11]
list12 = None * 5 ## [None, None, None, None, None]
아래와 같이 내포 표기를 이용한 리스트 생성도 가능하다.
내포 표기란, 리스트 안에서 for, if 문을 사용해 새로운 리스트를 생성하는 기법이다.
num = [1, 2, 3, 4, 5]
twi = [num * 2 for num in numbers if num % 2 == 1] ## 리스트 num의 홀수 원솟값을 *2 한 리스트 생성
print(twi)
## Result ##
[2, 6, 10]
튜플(tuple)은 원소를 변경할 수 없는 이뮤터블(Imutable) 객체이다.
tuple( ) 함수를 사용하면 문자열이나 리스트 등 여러 자료형 객체를 원소로 하는 튜플을 생성할 수 있다.
range() 함수와 조합하면 특정 범위의 정수로 구성된 튜플을 생성할 수 있다.
tuple01 = tuple() ## 공백 튜플 생성
tuple02 = tuple('ABC') ## ('A', 'B', 'C')
tuple03 = tuple([1, 2, 3]) ## (1, 2, 3)
tuple04 = tuple(range(3)) ## (0, 1, 2)
tuple05 = tuple(range(1, 3)) ## (1, 2)
언팩 (Unpack)은 리스트, 튜플의 원소들을 풀어서 여러 변수에 동시에 대입하는 기능이다.
좌변에 여러 개의 변수를 놓고, 우변에 리스트나 튜플을 놓으면, 우변의 원소를 좌변의 변수들에 1번에 대입해준다.
x = [1, 2, 3]
a, b, c = x
print(a, b, c)
## Result ##
(1, 2, 3)
3.3) 배열의 원소에 접근하기
배열의 원소에 접근할 수 있는 방법은 인덱스(Index)와 슬라이스(Slice)로 나눠진다.
인덱스 (Index)는 리스트나 튜플의 원소에 접근할 때 사용한다.
각각의 원소들은 고유한 인덱스 값을 가지며, 이는 정수로 이루어져 있다.
인덱스 식을 사용하면 원하는 원소에 접근할 수 있는데, 인덱스 연산자 [ ] 안에 특정 원소의 정수 인덱스 값을 지정해주면 된다.
x = [1, 2, 3, 4, 5]
print(x[2])
print(x[-3])
x[-4] = 3.14
print(x)
print(x[9])
## Result ##
3
3
[1, 3.14, 3, 4, 5]
ERROR
슬라이스 (Slice)는 리스트 또는 튜플의 일부를 연속해서 또는 일정한 간격으로 꺼내 새로운 리스트나 튜플을 만드는 것이다.
슬라이스 식을 사용해 원소를 꺼낼 수 있다.
s = [1, 2, 3, 4, 5, 6, 7]
print(s[0:6])
print(s[0:7])
print(s[0:7:2])
print([-4:-2])
print(s[3:1])
## Result ##
[1, 2, 3, 4, 5, 6]
[1, 2, 3, 4, 5, 6, 7]
[1, 3, 5, 7]
[4, 5]
[]
3.4) 배열과 관련된 주요 함수들
len()
len() 함수는 인수로 전달한 배열의 원소 수를 반환한다.
min()
min() 함수는 인수로 전달한 배열이 가진 원소 중 최솟값을 반환한다.
max()
max() 함수는 인수로 전달한 배열이 가진 원소 중에 최댓값을 반환한다.
3.5) 빈 배열 판단하기
배열을 참조하는 변수를 조건식에 사용해 원소 유무를 판단할 수 있다.
배열이 비어 있다면 조건식 결과가 False이다.
if (x):
## x가 비어 있지 않으면 True
else :
## x가 비어 있으면 False
3.6) 배열의 대소 또는 등가 관계 판단
비교 연산자를 사용하면 배열의 대소, 등가 관계를 판단할 수 있다.
맨 앞 원소부터 차례로 비교하며, 원소의 값이 같으면 다음 원소 비교로 넘어간다.
배열의 원소 수가 다르면, 원소 수가 많은 배열을 크다고 판단한다.
3.7) 리스트와 튜블의 공통점/차이점
수고하셨습니다!
'Dev. Study Note > Algorithm (Python)' 카테고리의 다른 글
6. 리스트와 튜플 (0) | 2022.01.11 |
---|---|
5. 배열 (0) | 2022.01.07 |
4. Python 변수 (0) | 2022.01.04 |
2. 반복 알고리즘 (0) | 2021.12.30 |
1. 알고리즘 (0) | 2021.12.29 |