Python 07. 1차원 배열

김지민·2024년 7월 27일
  • 한 줄에 공백을 사이에 두고 10개의 숫자가 주어졌을 때, 이 숫자들의 합을 구하는 코드
arr = input().split()

sum_val = 0
for i in range(10):
    sum_val += int(arr[i])
print(sum_val)

for elem in arr: 
	print(elem)
	
#map을 이용하면 리스트에 있는 원소 type을 전부 변환한 이후의 리스트를 반환할 수 있음
arr = list(map(int, input().split()))
print(arr)

>> 1 3
[1, 3]

# 2개의 숫자만 입력받는 경우, tuple 사용 가능
n, m = tuple(map(int, input().split()))
print(n, m)

>> 1 3
1 3
  • Slicing

리스트에 대해 slice([])를 활용하면 일부 범위, 조건에 해당하는 원소들을 가져올 수 있습니다.

arr[start:end:step]

start index에서 시작하여 end index 직전까지 step씩 뛰며 전진합니다.

index  0  1  2  3  4
=====================
arr = [1, 2, 3, 4, 5]
print(arr[1:3:1]) # 1번째 index부터 3번째 index 전까지 1씩 증가
print(arr[1:3]) #이렇게 표현해도 동일
print(arr[:3]) #처음부터 받고 싶은 경우
print(arr[3:0:-1]) # 3번째 index부터 0번째 index 전까지 -1씩 감소하면서
print(arr[::-1]) # 전체 원소 뒤집기
  •  10개의 원소를 입력받아 뒤집는 문제는 다음과 같이 코드를 작성
arr = list(map(int, input().split()))
reversed_arr = arr[::-1]

for elem in reversed_arr:
    print(elem, end=" ")

리스트 push, pop, len

# 비어있는 리스트
arr = []
혹은
arr = list()
  • append 함수를 이용하면, 리스트의 맨 끝에 원소를 추가할 수 있습니다.
arr = [3, 5]
arr.append(9) #append 괄호에 들어갈 원소 쓰기
print(arr)

>> [3, 5, 9]
  • pop 함수를 이용하면, 리스트의 맨 뒤에 있는 원소를 지울 수 있습니다.
arr = [3, 5, 9]
arr.pop()
print(arr)

>> [3, 5]
  •  len() 함수: 해당 리스트에 있는 원소의 개수를 반환해줍니다.
>> print(len([1, 3, 5]))
3
  • 모든 원소의 합을 구하기
arr = [1, 2, 2, 5]

n = len(arr)

sum_val = 0
for i in range(n):
    sum_val += arr[i]

print(sum_val)

>> 10

이때 len 함수를 이용하지 않고, 다음과 같이 코드를 작성하여 원소를 바로 꺼내는 식으로도 해결이 가능

arr = [1, 2, 2, 5]

sum_val = 0
for elem in arr:
    sum_val += elem
#or
sum_val = sum(arr) #sum 함수 사용

print(sum_val)

>> 10
  • sum 함수란?
    - sum(iterable, start) 형태
    - iterable: 리스트나 튜플 등 숫자로 이루어진 객체
    - start: 처음에 더해줄 값
    - 그러니까, iterable 내의 값을 다 더해주고 start도 더해주는 거

  • 2번째 숫자부터 끝까지의 합을 구하기 위해서는 range를 꼭 사용해야만 할까요?
    이런 경우에는, slicing을 활용해볼 수 있습니다.

arr = [1, 2, 2, 5]

sum_val = 0
for elem in arr[1:]:
    sum_val += elem
#or
sum_val = sum(arr[1:])

print(sum_val)

>> 9

음수 index

 arr[-1]의 의미는 끝에서부터 첫 번째 원소, arr[-2]의 의미는 끝에서부터 2번째 원소라는 의미를 갖습니다.

index  0  1  2  3
index -4 -3 -2 -1
==================
arr = [1, 2, 3, 5]

따라서 가장 끝에 있는 2개의 원소를 더해 출력하는 코드는 다음과 같이 작성해볼 수 있습니다.

arr = list(map(int, input().split()))

print(arr[-1] + arr[-2])

list comprehension

선언과 동시에 for loop으로부터 나온 원소를 원하는 값으로 변경해줄 수 있습니다

[(append 안에 들어갈 내용) (for loop)]

# 조건문을 포함하는 list comprehension
[(append 안에 들어갈 내용) (for loop) <조건문>]
# 리스트 arr의 각 원소들을 전부 2배씩 해주는 코드
arr = [1, 2, 3, 5]
new_arr = [elem * 2 for elem in arr]

# 홀수의 제곱수 배열
list_ = [i ** 2 for i in range(1, 10) if i % 2 == 1]

변수가 두 개 이상인 list comprehension

list_ = [(i + j) for i in range(3) for j in range(3)]

해당 코드의 결과는 다음과 같습니다.

[0, 1, 2, 1, 2, 3, 2, 3, 4]

for 문을 사용해 표현하면 다음과 같습니다.

list_ = []
for i in range(3):
    for j in range(3):
        list_.append(i + j)

피보나치 수열

arr = [0, 1, 1]

# 3번째 항부터 10번째 항까지 추가 - 배열이 이미 있어도 append로 그냥 넣을 수 있음 
for i in range(3, 11): 
    arr.append(arr[-1] + arr[-2])

# 10번째 항 출력
print(arr[10])

>> 55

# or - p: 전항, pp: 전전항

pp, p = 1, 1

for _ in range(3, 11):
    pp, p = p, pp + p

print(p)

>> 55

Counting 배열

전부 0으로 초기화된 크기가 7인 배열이 필요합니다. (1부터 6까지를 각각 index로 사용한다고 했을 때)

# 숫자 별 출현 횟수 1  2  3  4  5  6
count_arr = [0, 0, 0, 0, 0, 0, 0]

# 혹은 다음과 같이도 정의가 가능합니다.
count_arr = [0] * 7

# list comprehension을 이용할수도 있습니다.
count_arr = [0 for _ in range(7)]

10번 던져 나온 숫자 목록을 arr라 한다면, count_arr의 해당 숫자 index에 1씩 증가시키는 식으로 진행해볼 수 있습니다.

count_arr = [0] * 7

# 개수 세기
arr = list(map(int, input().split()))
for elem in arr:
    count_arr[elem] += 1

# 개수 출력
for i in range(1, 7):
    cnt = count_arr[i]
    print(f"숫자 {i} - {cnt}번")

탐색 - 문자를 원소로 갖는 배열

  •  enumerate() 함수
    - 원소와 index가 동시에 필요한 경우
    - enumerate로 list를 감싸면, 원소로 (index, 원소)를 동시에 받으며 진행할 수 있음
    - 형식: enumerate(순서가 있는 객체, start=0)
word = ['A', 'P', 'P', 'L', 'E']

# 해당 문자를 찾지 못했다면 -1
idx = -1

# 문자 탐색
for i, char in enumerate(word):
    if char == 'L':
        idx = i

# 문자가 존재하지 않는 경우
if idx == -1:
    print("not exist")
else:
    print(idx)

>> 3
  • 특정 원소가 리스트 안에 있는지, 없는지에 대해서:  innot in 이라는 키워드
word = ['A', 'P', 'P', 'L', 'E']

if 'L' in word:
    print('L is in list')
if 'L' not in word:
    print('L is not in list')

>> L is in list
  • 이미 존재하는 원소가 list의 어느 index에 있는지는 .index() 함수
    - 존재하지 않는 원소에 대해 index 함수를 이용하면 Value Error
    - index 함수 이용시에는 꼭 먼저 해당 원소가 리스트에 포함되는지를 확인한 이후에 진행
    - 만약 문자가 여러 개 존재한다면, 그 중 가장 앞에 있는 index를 반환합니다.
word = ['A', 'P', 'P', 'L', 'E']

if 'K' in word:
    print(word.index('K'))
  • 특정 원소의 개수
    - count()라는 함수를 사용해볼 수도 있습니다.
word = ['A', 'P', 'P', 'L', 'E']

cnt = word.count('P')
print(cnt)

>> 2

Min/Max

  • 최대: max(arr)
arr = [-1, -5, -2, -5, -3, -9]
# 첫번째 원소를 max로 설정하고 두번째 값부터 비교하면서 알아내기
max_val = arr[0]
for elem in arr[1:]:
    if elem > max_val:
        max_val = elem

print(max_val)
  • 최소: min(arr)
profile
열혈개발자~!!

0개의 댓글