Challenge
문제를 요약하면 N*M의 두 행렬에 대한 덧셈을 하는 값을 출력하는 문제입니다. 단, N*M은 일정하지 않을 수 있다는 점을 잊어서는 안 됩니다.
Description
N*M크기의 두 행렬 A와 B가 주어졌을 때, 두 행렬을 더하는 프로그램을 작성하시오.
Inputs
첫째 줄에 행렬의 크기 N 과 M이 주어진다. 둘째 줄부터 N개의 줄에 행렬 A의 원소 M개가 차례대로 주어진다.
이어서 N개의 줄에 행렬 B의 원소 M개가 차례대로 주어진다. N과 M은 100보다 작거나 같고, 행렬의 원소는 절댓값이 100보다 작거나 같은 정수이다.
* Example
3 3
1 1 1
2 2 2
0 1 0
3 3 3
4 4 4
5 5 100
Plain Text
복사
Outputs
첫째 줄부터 N개의 줄에 행렬 A와 B를 더한 행렬을 출력한다. 행렬의 각 원소는 공백으로 구분한다.
* Example
4 4 4
6 6 6
5 6 100
Plain Text
복사
Solve
문제 풀이에서 요구되는 내용은 N * M으로 이루어진 행렬에 대한 덧셈을 구하고 N * M 형태의 행렬로 출력하는 문제입니다. 문제의 난이도는 비교적 쉬워보이지만 몇 가지 고려해야할 점이 있었던 것을 간과하여 풀이가 오래 걸리게 되었습니다.
Python
First solve
처음에 N과 M의 행렬에서 행렬에 대한 이해가 부족하여 가로와 세로가 헷갈렸습니다. 때문에 몇 개의 행렬이 있을 것인지 가정을 두지 않고 푸는 방법을 채택하다 보니 알고리즘이 깔끔하지 않은 풀이를 작성하여 통과하였습니다.
•
모든 라인의 값을 받아온다.
•
받아온 모든 라인을 하나의 배열로 정렬한다.
•
배열을 절반으로 나누고, 배열 값을 더한다.
•
M개의 원소 개수만큼 잘라 출력한다.
import sys
done = False
N, M = [int(i) for i in sys.stdin.readline().strip().split(" ")]
T1 = []
T2 = []
result = []
while not done:
tmp = sys.stdin.readline().strip()
if not tmp:
break
tmp = [int(i) for i in tmp.split(" ")]
T1 += tmp
A = T1[int(len(T1)/2):]
B = T1[:int(len(T1)/2)]
for a, b in zip(A, B):
T2.append(a+b)
while T2:
result.append(T2[:M])
del T2[:M]
for r in result:
print(" ".join([str(i) for i in r]))
Python
복사
Better solve
이후 머리를 식히고(다음날) 다시 한 번 문제를 곱씹어 풀어보니 보다 깔끔한 풀이가 되었습니다. 처음에는 아래와 같은 코드로 작성하였으나, range 범위를 잘못 지정하여 RuntimeError가 계속 발생하였습니다.
import sys
N, M = [int(i) for i in sys.stdin.readline().strip().split(" ")]
A = []
B = []
R = []
for __ in range(N):
A.append([int(i) for i in sys.stdin.readline().strip().split(" ")])
for __ in range(N):
B.append([int(i) for i in sys.stdin.readline().strip().split(" ")])
for n in range(N):
tmp = []
for m in range(M):
tmp.append(A[n][m] + B[n][m])
R.append(tmp)
for r in R:
print(" ".join([str(i) for i in r]))
JavaScript
복사
Reviews
문제를 풀 때 반드시 문제에 대한 이해가 먼저라는 것을 다시 한 번 깨달았습니다. 또한 기존에 알고 있었던 에러(RuntimeError)에 대해 순간적으로 오해하여 방향이 잘못 틀어졌던 부분도 반성하게 되었습니다. RuntimeError 가 발생하여 알고리즘이 잘못됐다는 것은 인지했으나, 그 원인이 O(n^2) 때문일 것이라는 잘못된 원인 분석이 가장 큰 원인이었던 것 같습니다.