2차원 배열

2022. 10. 26. 21:13파이썬(Python)

1. 2차원 배열 입력

- n개의 줄에 걸쳐 각 n개의 숫자를 공백을 사이에 두고 입력.

- 행 단위로 합을 구할 때

n=int(input())

for _ in range(n):
    arr=list(map(int,input().split()))
    print(sum(arr))

결과

>> 4
>> 1 2 3 4
10
>> 5 6 7 8
26
>> 9 10 11 12
42
>> 13 14 15 16
58

- 위와 같은 방법으로는 행 단위로 합을 구할 수 있지만 열 단위로 합을 구하는 것은 불가능.

- 열 단위의 합을 구하기 위해서 2차원 배열을 사용

 

[[1,2,3,4], [5,6,7,8], [9,10,11,12], [13,14,15,16]]

- 각 원소을 의미

 

n=int(input())

arr2=[]
for _ in range(n):
    arr1=list(map(int,input().split()))
    arr2.append(arr1)

print(arr2)

결과

>> 4
>> 1 2 3 4
>> 5 6 7 8
>> 9 10 11 12
>> 13 14 15 16
[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]]

 

- for 안에 append만 사용하는 경우 list comprehension을 이용 가능

n=int(input())

arr2=[list(map(int,input().split())) for _ in range(n)]
print(arr2)

결과

4
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]]

 

- 2차원 배열의 원소arr2 [i][j].  (i+1행, j+1열에 위치한 원소)

n=int(input())

arr2=[list(map(int,input().split())) for _ in range(n)]
print(arr2[1][2])  # 2행 3열
print(arr2[0][3])  # 1행 4열

결과

>> 4
>> 1 2 3 4
>> 5 6 7 8
>> 9 10 11 12
>> 13 14 15 16
7
4

 

- 특정 위치의 원소 값 바꾸기

- '=' 연산 사용

n=int(input())

arr2=[list(map(int,input().split())) for _ in range(n)]
print(arr2[1][2])  # 2행 3열

arr2[1][2]=100
print(arr2)

결과

>> 4
>> 1 2 3 4
>> 5 6 7 8
>> 9 10 11 12
>> 13 14 15 16
7
[[1, 2, 3, 4], [5, 6, 100, 8], [9, 10, 11, 12], [13, 14, 15, 16]]

 

- 2차원 배열에서 len() 함수를 행 수가 반환

n=int(input())

arr2=[list(map(int,input().split())) for _ in range(n)]
print(len(arr2))

결과

>> 4
>> 1 2 3 4
>> 5 6 7 8
>> 9 10 11 12
>> 13 14 15 16
4

Q) 배열의 합

- n개의 줄에 n개의 자연수 입력

- 각 열의 합을 출력

 

n=int(input())

arr2=[list(map(int,input().split())) for _ in range(n)]

sum_val=0
for i in range(n):
    for j in range(n):
        sum_val+=arr2[j][i]
    print(sum_val)
    sum_val=0

- 열 단위의 합이므로 (arr2 [0][0]+arr2 [1][0]+arr2 [2][0]+...+arr2 [n-1][0]), (arr2 [0][1]+arr2 [1][1]+arr2 [2][1]+...+arr2 [n-1][1]), (arr2 [0][n-1]+arr2 [1][n-1]+arr2 [2][n-1]+...+arr2 [n-1][n-1])

- 각각의 원소를 sum_val에 더해 준다.

- sum_val을 출력 후, sum_val을 0으로 초기화하여 새로운 값을 계산

 

결과

>> 4
>> 1 2 3 4
>> 5 6 7 8
>> 9 10 11 12
>> 13 14 15 16
28
32
36
40

Q) 대소문자 바꾸기

- 자연수 a, b를 입력하여 a행 b열로 이루어진 2차원 배열을 만든다.

- a행 b열의 모든 원소는 알파벳이다.

- 알파벳 대문자는 소문자소문자는 대문자로 바꿔 출력.

a,b=map(int,input().split())

arr=[input().split() for _ in range(a)]
for i in range(a):
    for j in range(b):
        # 소문자 -> 대문자
        if ord(arr[i][j])>= ord('a') and ord(arr[i][j])<=ord('z'):
            arr[i][j]=chr(ord(arr[i][j])-32)
        
        # 대문자 -> 소문자
        elif ord(arr[i][j])>= ord('A') and ord(arr[i][j])<=ord('Z'):
            arr[i][j]=chr(ord(arr[i][j])+32)

for i in range(a):
    for j in range(b):
        print(arr[i][j],end=' ')
    print()

- ord(arr [i][j])가 ord('a') 보다 크거나 같고 ord('z') 보다 작거나 같으면 32를 빼서 chr로 묶어 arr [i][j]에 갱신한다.

- ord(arr [i][j])가 ord('A') 보다 크거나 같고 ord('Z') 보다 작거나 같으면 32를 더해서 chr로 묶어 arr [i][j]에 갱신한다. 


Q) 배열의 평균

- 자연수 a, b를 입력

- a행 b열의 숫자를 입력

- 가로 평균, 세로 평균, 전체 평균을 소수 둘째 자리까지 출력.

 

a,b=map(int,input().split())

col_avg=[[] for _ in range(a)]
row_avg=[[] for _ in range(b)]
total_avg=0

arr=[list(map(int,input().split())) for _ in range(a)]
for i in range(a):
    for j in range(b):
        col_avg[i].append(arr[i][j])
        row_avg[j].append(arr[i][j])

for i in range(a):
    print(f'{sum(col_avg[i])/b:.2f}',end=' ')
print()
for i in range(b):
    print(f'{sum(row_avg[i])/a:.2f}',end=' ')
print()
for i in range(a):
    total_avg+=sum(arr[i])
print(f'{total_avg/(a*b):.2f}')

- col_avg : 길이가 a이며 각각의 원소가 빈 리스트인 2차원 리스트

- col_avg [i]는 arr의 i+1행의 모든 원소들의 리스트

- row_avg : 길이가 b이며 각각의 원소가 빈 리스트인 2차원 리스트

- row_avg [j]는 arr의 j+1열의 모든 원소들의 리스트

- arr [i][j]를 col_avg [i], row_avg [j]에 삽입

- col_avg와 row_avg는 각 원소가 리스트이므로 순환하여 원소의 합을 구한 후

- sum(col_avg [i])은 b로 나누고, sum(row_avg [j])은 a로 나눈다.

- 전체 평균값은 arr의 각 숫자들을 모두 더한 후 a*b만큼 나눠준다.


Q) 계단 모양 출력

- 자연수 n 입력. nXn 크기의 정수를 입력

- 위의 이미지처럼 n=3, n=4일 때 각각 색칠된 칸의 수들의 합을 구한다.

 

n=int(input())

arr=[list(map(int,input().split())) for _ in range(n)]
sum_val=0
for i in range(n):
    for j in range(n-1-i,n):
        sum_val+=arr[i][j]
print(sum_val)

 

- 1행은 색칠된 곳이 arr [0][n-1].

- 2행은 색칠된 곳이 arr [1][n-1-1], arr [1][n-1]

- 3행은 색칠된 곳이 arr [2][n-1-2], arr [2][n-1-1], arr [2][n-1]

- k행은 색칠된 곳이 arr [k][n-1-k], arr [k][n-1-(k-1)],... , arr [k][n-1]

- 각 행의 색칠된 곳을 모두 더해서 출력

 

결과

>> 4
>> 1 2 3 4
>> 5 6 7 8
>> 9 10 11 12
>> 13 14 15 16
110

'파이썬(Python)' 카테고리의 다른 글

2차원 배열 활용 2  (0) 2022.11.03
2차원 배열 활용  (0) 2022.10.28
리스트 최대 최소 2  (0) 2022.10.25
리스트 최대, 최소  (0) 2022.10.23
리스트 탐색  (0) 2022.10.22