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