[Python] 백준 2738 | 행렬 덧셈 : 2차원배열

heige·2023년 12월 8일
0

BOJ

목록 보기
19/46
post-thumbnail

문제

https://www.acmicpc.net/problem/2738

풀이

문제 자체는 어려운 게 아닌데, 파이썬에서 2차원 배열 사용하는 게 처음이다보니 생각할 것과 배울 것들이 많았다.

첫 시도

N, M = map(int, input().split())
A = list()
B = list()
AB = [[0 for j in range(M)] for i in range(N)]
for i in range(N) :
    A.append(list(map(int, input().split())))
for i in range(N):
    B.append(list(map(int, input().split())))
    for j in range(M) :
        AB[i][j] = A[i][j] + B[i][j]

for a, b, c in AB :
    print(a, b, c)
  • 파이참에서는 결과가 잘 나왔지만 백준 저지에서는 런타임에러(ValueError) 발생. 대체 뭘까 오랫동안 고민
  • M(열)의 길이가 달라졌을 때,아래 코드 때문에 에러가 발생한다. 3개만 출력하게 되기 때문에.
for a, b, c in AB :
    print(a, b, c)

최종

2차원 배열 A와 B를 더하는 또다른 list를 만들지 않고 그냥 더해서 출력하면 된다.

N, M = map(int, input().split())
A = list()
B = list()
for i in range(N) :
    A.append(list(map(int, input().split())))
for i in range(N):
    B.append(list(map(int, input().split())))

for i in range(N):
    for j in range(M):
        print(A[i][j] + B[i][j], end=' ')
    print()

💡 배운 내용

2차원 배열 선언 시 주의점

  • 아래와 같은 방식으로 2차원 배열 선언하면 문제가 생긴다.
rows = 10
arr = [0] * rows
  • arr의 0행 0열에 대해서만 값의 변경을 시도했는데, arr의 모든 행의 0열의 값이 변경된다.
  • Python에서는 * 연산자를 이용해 배열을 선언하게 되면, 얕은 복사(shallow copy)가 진행된다.
    즉, 배열 내의 요소들이 같은 객체를 가리키게 되는 것이다. 따라서, 이 방식으로 2차원 배열을 선언하고 요소를 변경하게 되면 다른 요소들의 값도 같이 바뀌는 것이다.
  • 아래와 같이 선언하는 것이 바람직하다.
rows = 10
cols = 5
arr = [[0 for j in range(cols)] for i in range(rows)]

IndexError: list assignment index out of range

  • 처음 문제 풀 때 아래와 같이 했다가 에러가 나왔다.
list = []

for i in range(6):
	list[i] = i
  • 빈 리스트에 인덱스를 지정했을 때 나오는 에러이다.
    위의 경우, 현재 list는 Null 인데, 인덱스를 지정했으므로 에러가 난다.

append 함수 사용

list.append(1)을 하면, 리스트 첫번째에 '1'이 입력된다.

insert 함수 사용

list.insert(0, 1)을 하면, 리스트 첫번째에 '1'이 입력된다.

리스트 미리 설정하기

list = []
list = [0] * 10  
# list = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
# 0이 10개 들어가 있는 리스트화

2차원 배열 입력 받기

n, m = map(int, input().split())

#1
li = [0 for _ in range(n)]
for i in range(n):
    li[i] = list(map(int, input().split()))
    
#2
li = []
for i in range(n) :
    li.append(list(map(int, input().split())))
    
#3
li = [list(map(int, input().split())) for _ in range(n)]

2차원 배열 쉽게 출력

for문 사용

  • 첫 번째 코드는 열의 값이 확실하고 적을 때만 사용 가능할듯.
a = [[10, 20], [30, 40], [50, 60]]
for x, y in a:    # 리스트의 가로 한 줄(안쪽 리스트)에서 요소 두 개를 꺼냄
	print(x, y)
a = [[10, 20], [30, 40], [50, 60]]
 
for i in a:        # a에서 안쪽 리스트를 꺼냄
    for j in i:    # 안쪽 리스트에서 요소를 하나씩 꺼냄
        print(j, end=' ')
    print()
a = [[10, 20], [30, 40], [50, 60]]
 
for i in range(len(a)):            # 세로 크기
    for j in range(len(a[i])):     # 가로 크기
        print(a[i][j], end=' ')
    print()
profile
웹 백엔드와 클라우드 정복을 위해 탄탄한 기반을 쌓아가고 있는 예비개발자입니다. 'IT You Up'은 'Eat You Up'이라는 표현에서 비롯되어, IT 지식을 끝까지 먹어치운다는 담고 있습니다.

0개의 댓글