EverGiver
02-1 자료구조와 배열 본문
728x90
배열 개념 알아보기
배열을 사용하면 따로따로 흩어진 변수를 하나로 묶어서 사용할 수 있어 코드를 쉽고 효율적으로 작성할 수 있다.
score1 = int(input('1번 학생의 점수를 입력하세요.: '))
score2 = int(input('2번 학생의 점수를 입력하세요.: '))
score3 = int(input('3번 학생의 점수를 입력하세요.: '))
score4 = int(input('4번 학생의 점수를 입력하세요.: '))
score5 = int(input('5번 학생의 점수를 입력하세요.: '))
total = 0
total += score1
total += score2
total += score3
total += score4
total += score5
- 요구 사항이 생기면 어떻게 수정할 수 있을까?
1. 학생 수를 변경하는 경우
2. 특정 학생의 시험 점수를 확인하거나 변경하는 경우
3. 최저점과 최고점을 구하거나 정렬이 필요한 경우
→ 프로그램의 작성 방식을 근본적으로 바꿔야 이러한 요구 사항을 제대로 반영할 수 있다.
- 학생 점수는 하나의 값을 저장하는 변수가 아니라 묶음 단위로 값을 저장하는 배열(array)이라는 자료구조로 다룬다.
- 배열에는 객체가 저장되며, 배열에 저장된 객체 하나하나를 원소(element)라고 한다.
- 각 원소는 0, 1, 2,... 순으로 인덱스(index)를 부여받는다. - 변수로 해결하기 어려운 문제를 배열로 보완하면 프로그래밍을 효율적으로 할 수 있다.
- 배열 원소의 자료형은 int형, float형 등 어떤 것이라도 상관없다.
- 배열에는 서로 다른 자료형을 같이 저장할 수 있으며, 배열 원소 자체를 배열에 저장할 수 있다.
리스트와 튜플 알아보기
리스트와 튜플은 데이터 컨테이너라고 하며, 비슷한 기능을 하는 듯 하지만 원소를 변경할 수 있는지 없는지에 따라 차이가 있다.
- 리스트의 기초
: 원소를 변경할 수 있는 뮤터블(mutable) list형 객체
- 연산자 [ ] 안에 원소로 쉼표(,)로 구분하여 표기하여 생성할 수 있다.
- 원소 없이 [ ]만 사용하면 빈 리스트를 생성한다.
list01 = [] # [] 빈 리스트 생성 list02 = [1, 2, 3] # [1, 2, 3] list03 = ['A', 'B', 'C', ] # ['A', 'B', 'C'] 맨 마지막 원소에 쉼표를 써도 됨
- 파이썬 내장 함수인 list( )를 사용하면 문자열이나 튜플 증 다양한 자료형 객체를 원소로 하는 리스트를 생성할 수 있다.
list04 = list() # [] 빈 리스트 생성 list05 = list('ABC') # ['A', 'B', 'C'] 각각의 문자로부터 원소 생성 list06 = list([1, 2, 3]) # [1, 2, 3] 리스트로부터 원소 생성 list07 = list((1, 2, 3)) # [1, 2, 3] 튜플로부터 원소 생성 list08 = list({1, 2, 3}) # [1, 2, 3] 집합으로부터 원소 생성
- 특정 범위의 정수로 구성된 리스트를 만들고자 한다면 range( ), list( ) 함수를 조합하여 사용하면 된다.)
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]
- 리스트의 원소 개수는 리스트를 만들기 전에 반드시 결정해야 한다.
(원소값을 정하지 않는 리스트는 None을 사용하면 만들 수 있다.
list12 = [None] * 5 # [None, None, None, None, None]
- 튜플의 기초
: 원소에 순서를 매겨 결합한 것으로 원소를 변경할 수 없는 이뮤터블(immutable) 자료형이다.
- 원소를 쉼표(,)로 구분하여 나열한 뒤 결합 연산자 ()로 둘러싸는 방식으로 생성
- 맨 마지막 원소 뒤에 쉼표를 써도 상관없다.
- ( )만 사용하면 빈 튜플을 생성한다.
- 리스트와 다르게 결합 연산자 ( )를 생략할 수 있다.
- 원소가 1개인 경우 원소 뒤에 쉼표를 반드시 입력해야 한다.tuple01 = () # () tuple02 = 1, # (1,) tuple03 = (1,) # (1,) tuple04 = 1, 2, 3 # (1, 2, 3) tuple05 = 1, 2, 3, # (1, 2, 3) tuple06 = (1, 2, 3) # (1, 2, 3) tuple07 = (1, 2, 3, ) # (1, 2, 3) tuple08 = 'A', 'B', 'C', # ('A', 'B', 'C')
(쉼표가 없으면 튜플이 아니라 단순 변수로 여긴다.)
- 파이썬 내장 함수인 tuple( )을 사용하면 문자열이나 리스트 등 여러 가지 자료형 객체를 원소로 하는 튜플을 생성할 수 있다.v01 = 1 # 1 튜플이 아닌 하나의 값을 가진 int형 변수 v02 = (1) # 1 튜플이 아닌 하나의 값을 가진 int형 변수
- 특정 범위의 값을 원소로 갖는 튜플은 range( ) 함수가 생성하는 수열(이터너블 객체 : 반복 가능한 객체)을 tuple( ) 함수로 반환하여 만들 수 있다.tuple09 = tuple() # () 빈 튜플 생성 tuple10 = tuple('ABC') # ('A', 'B', 'C') 문자열의 각 문자로부터 원소를 생성 tuple11 = tuple([1, 2, 3]) # (1, 2, 3) 리스트로부터 원소 생성 tuple12 = tuple({1, 2, 3}) # (1, 2, 3) 집합으로부터 원소 생성
tuple13 = tuple(range(7)) # (0, 1, 2, 3, 4, 5, 6) tuple14 = tuple(range(3, 8)) # (3, 4, 5, 6, 7) tuple15 = tuple(range(3, 13, 2)) # (3, 5, 7, 9, 11)
- 리스트와 튜플 풀어내기
- 언팩(unpack)
: 리스트나 튜플의 원솟값들을 풀어 여러 변수에 대입하는 것
x = [1, 2, 3] # 리스트 x 선언 a, b, c = x # x를 언팩하여 변수 a, b, c에 대입 a, b, c # (1, 2, 3)
인덱스로 원소에 접근하기
리스트나 튜플의 원소에 접근할 때 인덱스를 사용한다.
- 양수 인덱스
: 맨 앞과 맨 끝을 표시 (0부터 1씩 증가)
- 음의 인덱스
: '0 - 전체 원소 수'부터 1씩 증가
- 인덱스 사용하기
- 인덱스 연산자 [ ] 안에 정수값 인덱스를 지정하는 인덱스식은 리스트의 특정 원소를 정할 수 있다.
x = [11, 22, 33, 44, 55, 66, 77] x[2] # 리스트 x의 앞에서 3번째 원소를 출력 x[-3] # 리스트 x의 뒤에서 3번째 원소를 출력 x[-4] = 3.14 # 리스트 x의 뒤에서 4번째 원소에 새로운 값을 대입 x[7] # 존재하지 않는 인덱스이므로 오류를 출력 x[7] = 3.14 # x[7]에는 값을 대입할 수 없으무로 오류를 출력
슬라이식으로 원소에 접근하기
- 슬라이스(slice)
: 리스트 또는 튜플의 원소 일부를 연속해서 또는 일정한 간격으로 꺼내 새로운 리스트 또는 튜플을 만드는 것
- 슬라이스식으로 원소 꺼내기
- s[i:j]
: s[i]부터 s[j-1]까지 나열한다.
- s[i:j:k]
: s[i]부터 s[j-1]까지 k씩 건너뛰며 나열한다.
- i, j, k를 지정하는 규칙s = [11, 22, 33, 44, 55, 66, 77] s[0:6] # 리스트 s의 0번째 원소부터 5번째 원소를 출력 s[0:7] # 리스트 s의 0번째 원소부터 6번째 원소를 출력 s[0:7:2] # 리스트 s의 0번째 원소부터 6번째 원소 중 2씩 건너뛰며 원소를 출력 s[-4:-2] # 리스트 s의 뒤에서 4번째 원소부터 뒤에서 2번째 원소를 출력 s[3:1] # 리스트 s의 j값(1)이 i값(3)보다 작지만 오류가 나지 않음
▷ i, j가 len(s) 보다 크면 len(s)가 지정된 것으로 간주한다.
▷ i가 없거나 None이면 0이 지정된 것으로 간주한다.
▷ j가 없거나 None이면 len(s)가 지정된 것으로 간주한다.패턴 설명 실행 예 실행 결과 s[:] 리스트 s의 원소를 모두 출력 s[:] [11, 22, 33, 44, 55, 66, 77] s[:n] 리스트 s의 원소 중 맨 앞에서부터 n개까지 출력 s[:3] [11, 22, 33] s[i:] 리스트 s의 원소 중 s[i]로부터 맨 끝까지 출력 s[3:] [44, 55, 66, 77] s[-n:] 리스트 s의 원소 중 맨 끝에서부터 n개까지 출력 s[-3:] [55, 66, 77] s[::k] 리스트 s의 원소 중 맨 앞에서부터 k개씩 건너뛰며 출력 s[::2] [11, 33, 55] s[::-1] 리스트 s의 원소 중 맨 끝에서부터 전부 출력 s[::-1] [77, 66, 55, 44, 33, 22, 11] - 뮤터블과 이뮤터블의 대입
- 이뮤터블 (immutable)
: 값을 변경할 수 없는 특성
(리스트, 딕셔너리, 집합 등)
- 뮤터블 (mutable)
: 값을 변경할 수 있는 특성
(수, 문자열, 튜플 등)
- 변수에 저장된 값이 변경되면 값을 복사하는 것이 아니라 값을 참조하는 객체의 식별 번호가 변경된다.
- 변수에 어떤 값을 대입하면 값이 아니라 식별 번호가 바뀐다!!!
- 파이썬은 대입 기호 =를 연산식에서 사용하는 +, * 등과 같이 취급하지 않는다.
▷ x + 17은 식이다.
▷ x = 17은 문이다.
자료구조의 개념을 알아보기
자료구조(data structure)
: 논리적인 관계로 이루어진 데이터 구성 / 데이터 단위와 데이터 자체 사이의 물리적 또는 논리적인 관계
- len( ) 함수로 배열의 원소 수 구하기
- 리스트나 튜플의 원소 수(배열의 길이)는 len( ) 함수로 구할 수 있다.
x = [15, 64, 7, 3.14, [32, 55], 'ABC'] len(x) # 6
- min( ), max( ) 함수로 배열의 최솟값과 최댓값 구하기
- 해당 리스트 또는 튜플이 가진 원소 중에서 최솟값 또는 최댓값을 얻을 수 있다. - 빈 배열 판단하기
- 배열에 원소가 하나도 없는지 확인하고 싶다면 배열을 참조하는 변수를 조건식에 그대로 사용하면 된다.
if x: # x가 비어 있지 않으면(True) 실행 else: # x가 비어 있으면(False) 실행
- 비교 연산자로 배열의 대소 또는 등가 관계 파악하기
- 파이썬에서는 값을 비교할 때 등가성(equality)과 동일성(identity)을 사용한다.[1, 2, 3] == [1, 2, 3] [1, 2, 3] < [1, 2, 4] [1, 2, 3, 4] <= [1, 2, 3, 4] [1, 2, 3] < [1, 2, 3, 5] [1, 2, 3] < [1, 2, 3, 5] <[1, 2, 3, 5, 6] # and 결합
▷ 등가성 비교 (== 사용)
: 좌변과 우변이 같은지 비교
▷ 동일성 비교 (is 사용)
: 값은 물론 객체의 식별 번호까지 같은지 비요
cf) 내포 표기 생성
: 리스트 안에서 for, if 문을 사용하여 새로운 리스트를 생성하는 기법
numbers = [1, 2, 3, 4, 5]
twise = [num * 2 for num in numbers if num % 2 == 1] # 리스트 numbers의 홀수 원소값을 *2한 리스트 생성
print(twise) # [2, 6, 10]
728x90
'Python > 알고리즘' 카테고리의 다른 글
02-2 배열이란? (0) | 2022.01.05 |
---|---|
01-2 반복하는 알고리즘 (0) | 2021.10.01 |
01-1 알고리즘이란? (0) | 2021.10.01 |
Comments