코드 저장소

공부에는 끝이 없다!

JAVA/코딩 테스트

백준 문제 풀이 - 2차원 배열 단계 - 2738번 행렬 덧셈 (브론즈 5)

VarcharC2K 2023. 8. 19. 16:13

브론즈 5단계의 간단한 문제이지만, 이중 반복문의 반복이 아닌 다른 방법으로 풀어 정리를 해두고자 한다.

우선 문제를 살펴보자.

 

해당 문제는 2차원 행렬이 주어지는 2개의 2차원 배열의 값을 더하여 하나의 2차원 배열로 만드는 것이다.

문제의 제약조건이 그렇게 크지 않아 배열의 크기가 100*100을 넘어 가지는 않는다.

때문에 대부분의 사람들이 이중 포문의 반복으로 풀어낸 것을 볼 수 있었다.

 

import java.io.IOException;
import java.util.Scanner;


public class Main {
    public static void main(String[] args) throws IOException {

        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();
        int m = sc.nextInt();
        int[][] arr = new int[n][m];


        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                arr[i][j] = sc.nextInt();
            }
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                arr[i][j] += sc.nextInt();
            }
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                System.out.print(arr[i][j]+" ");
            }
            System.out.println("");
        }
    }

}

대부분 다음과 같은 형태였는데, 2중 for문을 여러번 수행하면서 입력과 출력을 하는 형태였다.

그러나 위와 같은 형태는 배열의 크기가 커질수록 더욱 느려질 것이라 생각하여 조금 다른 형태로 구성해 보기로 하였다.

내가 구현한 코드는 다음과 같은데

import java.io.*;
import java.util.*;

class Main{
    public static int n,m,idx;
    public static String s;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());
        idx = 0;
        int[][] result = new int[n][m];
        while((s=br.readLine()) != null && !s.isEmpty()){
            st = new StringTokenizer(s);
            if(idx == n) idx = 0;

            for (int i = 0; i < m; i++) {
                result[idx][i] += Integer.parseInt(st.nextToken());
            }
            idx++;
        }

        StringBuilder sb = new StringBuilder();
        for (int[] nums : result) {
            for (int num : nums) {
                sb.append(Integer.toString(num)).append(" ");
            }
            sb.append("\n");
        }

        System.out.println(sb.toString());
    }
}

기본 2차원 배열을 만드는 형태는 동일하지만, 나는 이후 입력값이 없을때까지 while문을 순회하도록 한 후, idx라는 값을 두어 배열의 첫번째 값을 단일 for문 안에서 돌게 하였다.

출력은 동일하게 이중 for문을 순회하며 StringBuilder에 문자열을 append 한 후 한번에 출력하도록 하였다.

 

위와같이 처리한 이유는 처음에 문제에 접근할때, 입력받는 줄의 값이 2차원 배열의 첫번째 인덱스 값과 동일하다고 생각해서 였는데, 원래는 BufferdReader로 입력받은 값을 바로 String 배열 형태로 만들어서 ArrayList에 담고 처리하려고 했지만 int 형태로 변환할때 어차피 배열을 순회해야하는 문제가 생겨서 입력받는 while문 마다 idx값이 ++되도록 한 후 최대 값인 n을 넘어서면 다시 0으로 초기화하여 처음부터 받는 형태로 구성하였다.

 

어차피 입력값 자체가 똑같은 크기의 2차원 배열 2개를 입력 받는 형태이기에 크게 문제가 없이 잘 동작하였고, 속도도 잘 나오는 것을 확인 할 수 있었다.