1. 자료구조의 배경

자료구조는 컴퓨터 사이언스에 있어 전체적인 관점의 기초공사 개념이다.

프로그래밍언어와는 별개로, 대용량의 다양한 데이터를 효율적으로 처리(저장)하기 위해 자료구조라는 개념이 생겨나게 되었다.

효율적인 처리

효율적인 처리

  • 자동화
  • 빠른 계산
  • 반복 처리
  • 여러 값 동시 처리
  • 빠르게 변경되는 값들에 대한 처리
  • 특정 변수 처리
  • 특정 값을 다양한 형태로 보고자 할 경우
  • 조건 처리

다음과 같은 작업을 예시로 들 수 있겠다.
다음 예시는 여러 값을 (리스트 형식으로) 입력 받고, 특정 두 수의 합에 해당하는 값을 넣으면 그 두개 숫자에 해당하는 인덱스 값을 반환하는 함수이다.

# 특정 두 수의 합과 같은 인덱스값을 찾자.
def twonumbersum(numbers, result):
  for i in range(len(numbers)): #반복문
    for j in range(i+1, len(numbers)): #중첩반복문
      if numbers[i] + numbers[j] == result: #조건문
        return [i,j]

# 리스트값을 받기 위한 코드: 리스트 컴프리헨션 & 리스트 메소드(split) 활용
# ==> input 예시: 10,2,3
numbers = [int(numbers) for numbers in input("리스트값을 입력하세요 : ").split(',')]

# ==> input 예시: 13
result = int(input("두 수의 합을 입력하세요 : "))

print("인덱스값 : ", twonumbersum(numbers,result))
# [0, 2]

(참고) 함수 호출의 다양한 방식

(참고)
함수를 호출하는 경우 파라미터를 설정하고 인자 값을 전달하는 과정이 있는데, 이는 다양한 방식으로 가능하다.

  • 함수에 값만 전달
def remainder(num, div):
    return num % div

print(remainder(20, 7)) #argument에 값 전달
# 6
  • 함수에 변수이름과 값을 함께 전달
def remainder(num, div):
    return num % div

# argument에 변수명과 값을 함께 전달
print(remainder(num = 20, div = 7)) 
# 6
  • 함수에 기본값(default)을 할당하는 경우
def remainder(test, num = 5, div = 2):
    return num % div

#default 값(num=5, div=2)이 고정되어 있음
print(remainder(test = 7))
# 1

#default값이 있더라도 특정 argument 지정 가능
print(remainder(test = 7, num = 10, div = 5))
# 0

2. 자료구조의 활용

자료구조를 체계적으로 정립하기 위해 프로그래밍 언어별로 다양한 자료형이 생겨났고, 파이썬(python)에서는 리스트(list)와 튜플(tuple)을 활용하여 자료구조의 기본인 배열을 구현할 수 있다.

배열

배열

  • 여러 변수에 해당하는 값을 모아 관리하는 구조이다.

  • 배열을 사용하면 여러 변수를 선언하는 대신 하나의 변수로 모든 값을 효율적으로 관리/저장 할 수 있다.
    즉, 배열은 각각의 변수를 하나의 변수에 여러개의 인덱스로 묶는 것이다.

  • 리스트는 임의의 메모리(위치)에 자료를 *동적으로 처리할 수 있다.

  • 파이썬에서는 배열을 리스트와 튜플로 구현하고 활용한다.

  • 파이썬은 리스트 자료형이 자료구조의 연결리스트로 기능을 지원한다.

  • 파이썬의 리스트는 자료구조의 배열과 연결리스트의 특징을 모두 갖고 있다.

    • 배열의 특징 : 인덱스를 사용하여 노드에 접근 가능
    • 연결리스트의 특징 : 인덱스 크기를 자유롭게 확장 가능하고, 서로 다른 자료형을 노드로 갖을 수 있다.
    • 즉, 파이썬은 기존 프로그래밍에서 발생하는 어려운 점들을 부분적으로 개선시켰다.

*동적 : 자료를 저장하는 메모리의 크기를 자유롭게 확장하거나 축소할 수 있다.

메모리/주소

메모리 / 주소

  • 메모리를 사람에 비유하자면 뇌의 단기 기억을 담당하는 부분이라고 할 수 있다. 즉, 메모리의 용량이 크다 = 사람의 암기능력이 우수하다 정도로 생각할 수 있다.
  • 메모리는 많은 서랍을 가진 서랍장 같은 구조로 이해할 수 있으며, 각 서랍에 데이터를 저장한다.
  • 각 서랍마다 순서대로 번호가 있는데, 이를 '주소(address)라고 한다.

참고로, 8GB의 메모리는 사전 2,000~8,000권 정도에 해당하는 내용을 한번에 기억하는 것이 가능한 수준이다.

배열 예제 코드

자료구조라는 개념이 생겨나기 전에는 필요할 때마다 변수를 선언했다.

arr1 = 7
arr2 = 5
arr3 = 3
arr4 = 1

print(arr1)
# 7
print(arr2)
# 5
print(arr3)
# 3
print(arr4)
# 1

이후 요소와 인덱스로 구성되는 배열 개념이 생겼다.

# 배열요소 : arr[0],arr[1],arr[2],arr[3]
# 인덱스 : [0],[1],[2],[3]
arr = [7,5,3,1] 

print(arr[0])
# 7
print(arr[1])
# 5
print(arr[2])
# 3
print(arr[3])
# 1

파이썬의 리스트를 활용하여 배열이 어떻게 구성되는지 코드로 알아본다.

# 리스트 이름선언 및 값 할당
arr = [1,2,3,4,5,6] 

# 반복문을 활용하여 코드 한 줄로 리스트전체를 출력한다.(반복과 자동화개념)
for i in range(0,arr[5]): #arr[5] = 6
  print('배열요소 : ', arr[i], ', 배열인덱스 : ', [i])

# 배열요소 :  1 , 배열인덱스 :  [0]
# 배열요소 :  2 , 배열인덱스 :  [1]
# 배열요소 :  3 , 배열인덱스 :  [2]
# 배열요소 :  4 , 배열인덱스 :  [3]
# 배열요소 :  5 , 배열인덱스 :  [4]
# 배열요소 :  6 , 배열인덱스 :  [5]

len() 함수

리스트 메서드 중 하나인 len()함수를 이용해 배열의 원소길이를 구할 수 있다.
약간은 복잡해 보이는 다음 리스트를 살펴보자.

# 리스트 내 리스트가 있는 구조
x = [15,'x',20,13,['a','b'], 'cde','1']

# 리스트의 전체 길이 출력
print(len(x))
# 7 => 리스트 내 리스트는 하나의 원소로 친다.

# 리스트의 특정 인덱스의 길이 출력
print(x[1],'의 length: ', len(x[1]))
# x 의 length:  1

print(x[4],'의 length: ',len(x[4]))
# ['a', 'b'] 의 length:  2

print(x[5],'의 length: ',len(x[5]))
# cde 의 length:  3

print(x[6],'의 length: ',len(x[6]))
# 1 의 length:  1

3. 파이썬의 리스트

위에서 언급했던 것처럼 자료구조의 기본은 배열이라 할 수 있고, 파이썬에서는 이를 리스트튜플로 구현할 수 있다.
또한, 리스트와 튜플의 핵심은 인덱스를 사용한다는 점이다.

리스트 인덱싱/슬라이싱

위의 이미지를 참고한다면 다음 인덱싱/슬라이싱 예제 코드를 이해하는 건 어렵지 않다.

nums = [11,22,33,44,55]

print('nums[0:3] 결과:', nums[0:3])
#nums[0:3] 결과: [11, 22, 33]

print('nums[:3] 결과:', nums[:3])
#nums[:3] 결과: [11, 22, 33]

print('nums[1:] 결과:', nums[1:])
#nums[1:] 결과: [22, 33, 44, 55]

print('nums[::2] 결과:', nums[::2])
#nums[::2] 결과: [11, 33, 55]

print('nums[0:1:3] 결과:', nums[0:1:3])
#nums[0:1:3] 결과: [11]

print('nums[-3] 결과:', nums[-3])
#nums[-3] 결과: 33

print('nums[-3:-1] 결과:', nums[-3:-1])
#nums[-3:-1] 결과: [33, 44]

print('nums[1:-1] 결과:', nums[1:-1])
#nums[1:-1] 결과: [22, 33, 44]




created 22.11.2021

  • 글 작성

0개의 댓글