Python
[Python] 넘파이 없이 2차원 배열 생성하기 / 백준 ModuleNotFoundError
imnyoung
2024. 8. 29. 13:02
백준 2738번 문제

해당 문제를 풀기 위해 numpy를 이용해 빈 행렬 A, B를 생성했더니 결과 제출 시 '런타임 에러(ModuleNotFoundError)'가 났다.
ModuleNotFoundError가 뭔지 찾아보니... 다음과 같이 설명이 되어 있었다.

즉 백준에서는 파이썬 외부 라이브러리를 사용하여 결과를 제출할 수 없다는 것이었다.
그래서 numpy 모듈 없이 빈 2차원 행렬을 생성하는 방법을 알아보았다.
빈 2차원 배열/행렬 생성하기
1. List Comprehension(리스트 내포) 사용
# m x n 빈 2차원 행렬 생성
m, n = 3, 4
matrix0 = [[0] * n for _ in range(m)]
matrix1 = [[1] * n for _ in range(m)]
print(matrix0) # 출력: [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
print(matrix1) # 출력: [[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]
2. for문 사용
# m x n 빈 2차원 행렬 생성
m, n = 3, 4
matrix0 = [] # 1차원 배열 우선 생성
matrix1 = []
for i in range(m):
matrix0.append([0] * n) # 1차원 배열 안에 새로운 1차원 배열 추가
matrix1.append([1] * n)
print(matrix0) # 출력: [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
print(matrix1) # 출력: [[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]
3. numpy 모듈 사용
물론 가장 간단한 방법은 numpy 모듈을 사용하는 것이다.
# m x n 빈 2차원 행렬 생성
import numpy as np
m, n = 3, 4
matrix0 = np.zeros((m,n))
matrix1 = np.ones((m,n))
print(matrix0) # 출력: [[0., 0., 0., 0.], [0., 0., 0., 0.], [0., 0., 0., 0.]]
print(matrix1) # 출력: [[1., 1., 1., 1.], [1., 1., 1., 1.], [1., 1., 1., 1.]]
*numpy 모듈을 사용한 다양한 행렬 생성 방법은 아래 참고
백준 2738 문제 - 행렬 덧셈
이렇게 numpy 없이 빈 행렬 생성까지 성공하고 백준 2738 문제를 풀던 중 마지막 행렬 덧셈 부분에서도 문제가 생겼다.
numpy를 사용했을 때처럼 두 행렬을 '+'를 사용하여 더하면 행렬의 덧셈이 되지 않고 두 배열을 단순이 '연결(concatenation)'하게 된다는 것이었다. 따라서 행렬의 덧셈도 다른 방식으로 진행해 주었다. for문을 사용하여 각 원소값끼리 더해주고 그 값을 새로운 빈 2차원 행렬 sum의 해당 원소 위치에 대입해주었다.
#2738 - input(). numpy 없이.
n, m = map(int, input().split())
a = [] # 빈 1차원 배열 생성
b = [] # 빈 1차원 배열 생성
for i in range(n): # 빈 2차원 배열 생성방법 1
m_list = list(map(int, input().split()))
a.append(m_list)
for i in range(n):
m_list = list(map(int, input().split()))
b.append(m_list)
# 두 행렬의 덧셈
sum = [[0]*m for i in range(n)] # 빈 2차원 배열 생성방법 2
for i in range(n):
for j in range(m):
sum[i][j] = a[i][j] + b[i][j] # i행 j열 원소끼리 더해준 값을 sum의 i행 j행 원소에 대입
# 출력 방식 맞추기
for i in sum:
i = list(map(int, i))
i = list(map(str, i))
print(' '.join(i))
아래는 처음에 넘파이 모듈을 사용하여 풀었던 백준 2738문제 코드. 넘파이 사용시 두 행렬의 덧셈은 '+'를 이용하여 간단하게 해결 가능하다.
#2738 - input(), numpy 사용 버전
import numpy as np
n, m = map(int, input().split())
a = np.empty((n,m))
b = np.empty((n,m))
for i in range(n):
m_list = list(map(int, input().split()))
for idx, j in enumerate(m_list):
a[i,idx] = j
for i in range(n):
m_list = list(map(int, input().split()))
for idx, j in enumerate(m_list):
b[i,idx] = j
# 두 행렬의 덧셈
sum = a+b
# 출력 방식 맞추기
for i in sum:
i = list(map(int, i))
i = list(map(str, i))
print(' '.join(i))