자바 2738번

소만이·2024년 1월 3일

자바 백준문제

목록 보기
3/4


이 문제를 봤을 때 이해하는 데에도 시간이 조금 걸렸던 것 같다.
나는 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차원 배열을 찾아보았는데 다행히 생각보다 간단했다.

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();
      }
  }
}

첫번째 방법으로 했을 때 메모리 / 속도 / 코드 / 길이 가

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

0개의 댓글