Computer Science/자료구조

[4.20] 02-2 배열이란? -(1)

토마토. 2021. 4. 20. 18:47

<Do it! 자료구조와 함께 배우는 알고리즘 입문>

2장 기본 자료구조와 배열

02-2 배열이란? 

 

배열 원소의 최댓값 구하기

a = [1, 2, 3] 일 때 최댓값 구하기

a = [1, 2, 3, 4]일 때 최댓값 구하기

a = [1, 2, 3, 4]
max = a[0]
for i in range(1, len(a)):
  if a[i] > max:
    max = a[i]
print(max)

배열 원소의 최댓값을 구하는 함수 구현하기

 

from typing import Any, Sequence

def max_of(a: Sequence) -> Any:

  maximum = a[0]
  for i in range(1, len(a)):
    if a[i] > maximum:
      maximum = a[i]
  return maximum

if __name__ == '__main__':
  print('배열의 최댓값을 구합니다.')
  num = int(input('원소 수를 입력하세요.: '))
  x = [None] * num

  for i in range(num):
    x[i] = int(input(f'x[{i}]값을 입력하세요.:'))

  print(f'최댓값은 {max_of(x)}입니다.')
  

Q1. 시퀀스 원소의 최댓값 출력하기

시퀀스 자료형 - 순서가 있는 자료형. 

 

Q2. 주석과 자료형 힌트

from typing import Any, Sequence

- Any : 제약이 없는 자료형

- Sequence : sequence type 시퀀스형, list, bytearry, str, tuple, bytes

def may_of(a: Sequence) -> Any:

- 매개변수 a의 자료형은 Sequence

- 출력하는 것은 Any

 

Q3. 재사용할 수 있는 모듈 작성하기

module - 하나의 스크립트 프로그램(.py)

여기서 __name__ : 모듈 이름을 나타내는 변수

__name__= '__main__'인지 확인한다.  (max.py를 직접 시작한 경우)

변수 __name__은 원래 모듈의 이름임

모듈 객체 : __name__, __loader__, __package__, etc

 

모듈 테스트하기

max로 정의된 max_of() 함수 호출하기

- 입력받을 때 원소 수를 결정하기

#from max import max_of

print("배열의 최댓값을 구합니다.")
print("주의: 'End'를 입력하면 종료합니다.")

number = 0
x = []

while True:
  s = input(f'x[{number}]값을 입력하세요.:')
  if s == 'End':
    break
  x.append(int(s))
  number += 1

print(f'{number}개를 입력했습니다.')
print(f'최댓값은 {max_of(x)}입니다.')

f'어쩌구 {number} 어쩌구 ' 형식으로 쓰면, {number}에 변수값이 출력된다.

 

배열의 원솟값을 난수로 결정하기

입력 : 배열 원소 수, 최댓값, 최솟값

출력 : 1) 그 값 사이의 원소는 난수로 구성함

import random

def random_list(n, max, min):
  x = [None]*n
  for i in range(n):
    x[i]= random.randint(min, max)
  return x

print(random_list(5, 7, 0))

예제 코드

from typing import Any, Sequence

def max_of(a: Sequence) -> Any:

  maximum = a[0]
  for i in range(1, len(a)):
    if a[i] > maximum:
      maximum = a[i]
  return maximum  

import random
#from max import max_of

print('난수의 최댓값을 구합니다.')
num = int(input('난수의 개수를 입력하세요.: '))
lo = int(input('난수의 최솟값을 입력하세요.: '))
hi = int(input('난수의 최댓값을 입력하세요: '))
x = [None] * num

for i in range(num):
  x[i] = random.randint(lo, hi)

print(f'{(x)}')
print(f'이 가운데 최댓값은 {max_of(x)}입니다.')

튜플, 문자열, 문자열 리스트의 최댓값 구하기

 

* 각 배열 원소의 최댓값을 구해서 출력하기

입력 : t = (4, 5, 6, 7, 2, 3.14, 9)

s = 'string'

a = ['D', 'Da', 'TAE']

출력: 7, t, TAE

from typing import Any, Sequence

def max_of(a: Sequence) -> Any:

  maximum = a[0]
  for i in range(1, len(a)):
    if a[i] > maximum:
      maximum = a[i]
  return maximum  

#각 배열 원소의 최댓값을 구해서 출력하기

t = (4, 5, 6, 7, 2, 3.14, 9)
s = 'string'
a = ['D', 'Da', 'TAE']

#출력: 7, t, TAE

def max_of_Any(a):
  return max_of(a)

print(max_of_Any(a))
print(max_of_Any(s))
print(max_of_Any(t))

* max_of() 함수가 Any라서 튜플, 리스트, str도 되는건가? 

 

따로따로 생성한 리스트, 튜플의 동일성 판단하기

lst1 = [1]

lst2 = [2]

로 정의했을 때

lst1 is lst2는 False임

- identity 식별번호가 다르기 때문(고정된 값 literal이 아님)

literal : 값 그 자체, 고정된 값(ex) 정수, 실수, 복소수 등)

 

리스트 스캔

방법 1. 원소 수를 len()로 미리 알아내어 원소 수 -1까지 반복함

x = ['a', 'b', 'c', 'd']

for i in range(len(x)):
  print(f'x[{i}] = {x[i]}')

방법 2. 인덱스와 원소를 짝지어 enumerate()함수로 반복하여 꺼낸다. 

x = ['a', 'b', 'c', 'd']

for i, n in enumerate(x):
  print(i, n)

  방법 3. 1부터 카운트를 시작한다. 

x = ['a', 'b', 'c', 'd']

for i, n in enumerate(x, 1):
  print(i, n)

 

방법 4. 인덱스값 대신 in을 사용한다.

x = ['a', 'b', 'c', 'd']

for i in x:
  print(i)

튜플의 스캔

[] -> ()

 

이터러블

반복 가능한 - iterable 객체 : 문자열, 리스트, 튜플, 집합, 딕셔너리 등

iter()

iterator

__next__

next()

StopIteration