EverGiver

02-1 자료구조와 배열 본문

Python/알고리즘

02-1 자료구조와 배열

친절한개발초보자 2022. 1. 3. 23:46
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) 자료형이다.
    - 원소를 쉼표(,)로 구분하여 나열한 뒤 결합 연산자 ()로 둘러싸는 방식으로 생성
    - 맨 마지막 원소 뒤에 쉼표를 써도 상관없다. 
    - ( )만 사용하면 빈 튜플을 생성한다.
    - 리스트와 다르게 결합 연산자 ( )를 생략할 수 있다.
    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')
    - 원소가 1개인 경우 원소 뒤에 쉼표를 반드시 입력해야 한다.
      (쉼표가 없으면 튜플이 아니라 단순 변수로 여긴다.)
    v01 = 1		# 1 튜플이 아닌 하나의 값을 가진 int형 변수
    v02 = (1)	# 1 튜플이 아닌 하나의 값을 가진 int형 변수​
    - 파이썬 내장 함수인 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) 집합으로부터 원소 생성​
    - 특정 범위의 값을 원소로 갖는 튜플은 range( ) 함수가 생성하는 수열(이터너블 객체 : 반복 가능한 객체)을 tuple( ) 함수로 반환하여 만들 수 있다.
    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씩 건너뛰며 나열한다.
    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, k를 지정하는 규칙
      ▷ 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) 실행​
  • 비교 연산자로 배열의 대소 또는 등가 관계 파악하기
    [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 결합​
    - 파이썬에서는 값을 비교할 때 등가성(equality)과 동일성(identity)을 사용한다.
      ▷ 등가성 비교 (== 사용)
          : 좌변과 우변이 같은지 비교
      ▷ 동일성 비교 (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