Code/Algorithm

[Algorithm] 기본 자료구조와 배열_1

heedy 2022. 11. 21. 15:45
728x90

02 - 1 자료구조와 배열

실습 2-1 학생 5명의 시험 점수를 입력받아 합계와 평균을 출력하기

# 학생 5명의 시험 점수를 입력받아 합계와 평균을 출력하기

print('학생 그룹 점수의 합계와 평균을 구합니다.')

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

print(f'합계는 {total}점입니다.')
print(f'평균은 {total / 5}점입니다.')
학생 그룹 점수의 합계와 평균을 구합니다.
1번 학생의 점수를 입력하세요.85
2번 학생의 점수를 입력하세요.90
3번 학생의 점수를 입력하세요.80
4번 학생의 점수를 입력하세요.95
5번 학생의 점수를 입력하세요.100
합계는 450점입니다.
평균은 90.0점입니다.

>>> 프로그램을 확장하거나 다른 요구사항을 반영하기 어려운 상태, 근본적인 프로그램 작성 방식을 바꿔야 합니다.

  • 하나의 값을 저장하는 변수가 아니라 묶음 단위로 값을 저장하는 배열의 자료구조로 수정
  • 배열에는 객체가 저장되며, 배열에 저장된 객체 하나하나를 원소(element)라고합니다.
  • 각 원소는 0, 1, 2, … 순으로 인덱스(index)를 부여받습니다.

리스트와 튜플 알아보기

  • 파이썬에는 배열을 리스트(list)튜플(tuple)로 구현할 수 있습니다.
  • 리스트와 튜플은 데이터 컨테이너(data container)라고 하며, 비슷한 기능을 하는 듯하지만 원소를 변경할 수 있는지 없는지에 따라 차이가 있습니다.

리스트의 기초

  • 리스트는 원소를 변경할 수 있는 뮤터블(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')
  • tuple02, tuple03처럼 원소가 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)

인덱스로 원소에 접근하기

리스트나 튜플의 원소에 접근할 때는 인덱스(index)를 사용하면 됩니다.

리스트와 인덱스


인덱스식 사용하기

  • 인덱스 연산자 [ ] 안에 정숫값 인덱스를 지정하는 인덱스식은 리스트의 특정 원소를 정할 수 있습니다.
x = [11, 22, 33, 44, 55, 66, 77]
x[2] # 리스트 x의 앞에서 3번째 원소를 출력
>>> 33

x[-3] # 리스트 x의 뒤에서 3번째 원소를 출력
>>> 55

x[-4] = 3.14 # 리스트 x의 뒤에서 4번째 원소에 새로운 값을 대입

x
>>> [11, 22, 33, 3.14, 55, 66, 77]

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번째 원소를 출력
>>> [11, 22, 33, 44, 55, 66]

s[0:7] # 리스트 s의 0번째 원소부터 6번째 원소를 출력
>>> [11, 22, 33, 44, 55, 66, 77]

s[0:7:2] # 리스트 s의 0번째 원소부터 6번째 원소 중 2씩 건너뛰며 원소를 출력
>>> [11, 33, 55, 77]

s[-4:-2] # 리스트 s의 뒤에서 4번째 원소부터 뒤에서 3번째 원소를 출력
>>> [44, 55]

s[3:1] # 리스트 s의 j값(1)이 i값(3)보다 작지만 오류가 나지 않음
>>> []

i, j, k를 지정하는 규칙은 다음과 같습니다.

더보기
  • i, j가 len(s)보다 크면 len(s)가 지정된 것으로 간주합니다. 인덱스와 달리 범위에서 벗어나는 값을 지정해도 오류가 되지 않습니다.
  • i가 없거나 None이면 0이 지정된 것으로 간주합니다.
  • j가 없거나 None이면 len(s)가 지정된 것으로 간주합니다.

i, j, k의 값 중에서 1개의 값 이상을 생략하는 패턴은 다음과 같이 정리할 수 있습니다.

패턴 설명 실행 예 실행 결과
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, 77]
s[::-1] 리스트 s의 원소 중 맨 끝부터 전부 출력합니다. s[::-1] [77, 66, 55, 44, 33, 22, 11]

뮤터블과 이뮤터블의 대입

  • 이뮤터블(immutable): 값을 변경할 수 없는 특성(수, 문자열, 튜플 등)
  • 뮤터블(mutable): 값을 변경할 수 있는 특성(리스트, 딕셔너리, 집합 등)
a, b, c = 1, 2, 3
print(a,b,c)
>>> 1 2 3
x = 6
y = 2
x, y = y + 2, x + 3
print(x, y)
>>> 4 9

파이썬의 대입

  • 좌변에 변수 이름이 처음 나온 경우, 그 변수에 맞는 자료형으로 자동 선언해 줍니다.
  • 대입식은 값 자체가 아니라 참조하는 객체의 식별 번호를 대입합니다.
  • 여러 변수에 여러 값을 한꺼번에 대입할 수 있습니다.

자료구조의 개념 알아보기

  • 자료구조(data structure): 데이터 단위와 데이터 자체 사이의 물리적 또는 논리적인 관계.

len() 함수로 배열의 원소 수 구하기

x = [15, 64, 7, 3.14, [32, 55], 'ABC']
len(x)
>>> 6

빈 배열 판단하기

if x:
	# x가 비어 있지 않으면(True) 실행
else:
	# x가 비어 있으면(False) 실행

내포 표기 생성이란?

  • 리스트 안에서 for, if 문을 사용하여 새로운 리스트를 생성하는 기법을 내포표기 생성이라고 합니다.
numbers = [1, 2, 3, 4, 5]
twise = [num * 2 for num in numbers if num % 2 == 1]
print(twise)
>>> [2, 6, 10]

- 출처: Do it! 자료구조와 함께 배우는 알고리즘 입문 - 파이썬 편
- notebook ipynb file: https://github.com/heejvely/Algorithm/blob/main/Do_it_algorithm/Do_it_%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98_%EA%B8%B0%EB%B3%B8%20%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0%EC%99%80%20%EB%B0%B0%EC%97%B4.ipynb

 

GitHub - heejvely/Algorithm: 파이썬 알고리즘 인터뷰 책을 참고한 파이썬 알고리즘 연습

파이썬 알고리즘 인터뷰 책을 참고한 파이썬 알고리즘 연습. Contribute to heejvely/Algorithm development by creating an account on GitHub.

github.com

 

728x90