Search

BAEKJOON 2738 행렬덧셈

카테고리
Algorithm
태그
BAEKJOON
게시일
2023/03/07
수정일
2024/02/24 09:41
시리즈
1 more property

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) 때문일 것이라는 잘못된 원인 분석이 가장 큰 원인이었던 것 같습니다.

References