

이 문제를 봤을 때 이해하는 데에도 시간이 조금 걸렸던 것 같다.
나는 2차원 배열의 존재에 대해서 잘 알지 못했기 때문에 고민을 하다가 key는 하나의 행(Integer)으로, value는 열로 생각해 List로 map을 만들었다.
즉, Map<Integer, List> 형식의 aMap과 bMap을 만들어 하나의 행에 해당하는 열끼리 더하는 방식을 생각했다.

위 사진처럼 aMap과 bMap을 구성했다.
그런 후에 aMap의 key와 bMap의 key가 같으면 각각의 value들끼리 더해서 aMap을 바꿔치기할 생각으로 코드를 짰다.
코드는 다음과 같다.
import java.awt.*;
import java.io.*;
import java.util.*;
import java.util.List;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
st = new StringTokenizer(br.readLine(), " ");
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
Map<Integer, List<Integer>> aMap = new HashMap<>();
Map<Integer, List<Integer>> bMap = new HashMap<>();
for (int i = 0; i < N; i++) {
List<Integer> aList = new ArrayList<>();
st = new StringTokenizer(br.readLine(), " ");
for (int j = 0; j < M; j++) {
aList.add(Integer.parseInt(st.nextToken()));
}
aMap.put(i, aList);
}
for (int i = 0; i < N; i++) {
List<Integer> bList = new ArrayList<>();
st = new StringTokenizer(br.readLine(), " ");
for (int j = 0; j < M; j++) {
bList.add(Integer.parseInt(st.nextToken()));
}
bMap.put(i, bList);
}
A:
for (Map.Entry<Integer, List<Integer>> aListEntry : aMap.entrySet()) {
for (Map.Entry<Integer, List<Integer>> bListEntry : bMap.entrySet()) {
if (aListEntry.getKey().equals(bListEntry.getKey())) {
int count = 0;
for (Integer a : aListEntry.getValue()) {
for (int i = count; i < bListEntry.getValue().size(); i++) {
aListEntry.getValue().set(i, a + bListEntry.getValue().get(i));
count++;
break;
}
}
continue A;
}
}
}
for (Map.Entry<Integer, List<Integer>> integerListEntry : aMap.entrySet()) {
for (Integer i : integerListEntry.getValue()) {
System.out.print(i + " ");
}
System.out.println();
}
}
}
결과는 잘 나왔지만 코드를 짜면서도 이게 최선일까 생각하면서 다른 사람들이 한 코드를 찾아봤는데, 다들 2차원 배열을 이용해서 문제를 풀었다. 2차원 배열로 문제를 푸는 것이 이 문제의 목적이라고 생각해 2차원 배열을 찾아보았는데 다행히 생각보다 간단했다.
: 행과 열로 구성되며, 각 원소에는 두 개의 인덱스가 필요하다.
예를 들어 A[3][4] 라고 하면 3개의 행과 4개의 열을 가지고 있는 배열이다.

이 개념을 이용해 코드를 다시 짰다.
import java.awt.*;
import java.io.*;
import java.util.*;
import java.util.List;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
st = new StringTokenizer(br.readLine(), " ");
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int A[][] = new int[N][M];
int B[][] = new int[N][M];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine(), " ");
for (int j = 0; j < M; j++) {
A[i][j] = Integer.parseInt(st.nextToken());
}
}
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine(), " ");
for (int j = 0; j < M; j++) {
B[i][j] = Integer.parseInt(st.nextToken());
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
A[i][j] = A[i][j] + B[i][j];
System.out.print(A[i][j]+" ");
}
System.out.println();
}
}
}
첫번째 방법으로 했을 때 메모리 / 속도 / 코드 / 길이 가

두번째 방법으로 했을 때 메모리 / 속도 / 코드 / 길이 보다 확실히 효율성면에서 떨어진다는 것을 볼 수 있다!
