Every Step Matters

[Python] 넘파이 없이 2차원 배열 생성하기 / 백준 ModuleNotFoundError 본문

Python

[Python] 넘파이 없이 2차원 배열 생성하기 / 백준 ModuleNotFoundError

imnyoung 2024. 8. 29. 13:02

백준 2738번 문제

출처: Baekjoon

 

해당 문제를 풀기 위해 numpy를 이용해 빈 행렬 A, B를 생성했더니 결과 제출 시 '런타임 에러(ModuleNotFoundError)'가 났다.

ModuleNotFoundError가 뭔지 찾아보니... 다음과 같이 설명이 되어 있었다.

출처: https://help.acmicpc.net/judge/rte/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))