본문 바로가기

Coding Test/PS

[백준/Java] 2738번: 행렬 덧셈 (브론즈3)

🟤 백준 2738번: 행렬 덧셈 (브론즈3)

 

문제 풀이

1차 풀이

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

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		StringTokenizer st = new StringTokenizer(br.readLine());
		int n = Integer.parseInt(st.nextToken());
		int m = Integer.parseInt(st.nextToken());
		
		// 2개의 행렬 저장할 2개의 2차원 배열
		int[][] arr1 = new int[n][m];
		int[][] arr2 = new int[n][m];
		
		// 마지막 행렬 출력을 위한 StringBuilder
		StringBuilder sb = new StringBuilder();
		
		// 1번 행렬 저장
		for (int i=0; i<n; i++) {
		    st = new StringTokenizer(br.readLine());
		    for (int j=0; j<m; j++) {
		        arr1[i][j] = Integer.parseInt(st.nextToken());
		    }
		}
		
		// 2번 행렬 저장
		for (int i=0; i<n; i++) {
		    st = new StringTokenizer(br.readLine());
		    for (int j=0; j<m; j++) {
		        arr2[i][j] = Integer.parseInt(st.nextToken());
		    }
		}
		
		// 행렬 덧셈 결과를 StringBuilder에 저장
		for (int i=0; i<n; i++) {
		    for (int j=0; j<m; j++) {
		        arr1[i][j] += arr2[i][j];
		        sb.append(arr1[i][j]).append(" ");
		    }
		    sb.append("\n");    // 줄바꿈
		}
		
		System.out.println(sb);
	}
}

 

입력 받는 2개의 행렬을 저장하고, 행렬 덧셈 결과를 출력하는 코드를 구현하면 됨

행렬은 무조건 2차원 배열을 떠올리기!

 

출력할 때도 2차원 배열에 저장해서 출력할 수 있을까 생각했는데,

뭔가 더 헷갈려서 `StringBuilder`를 사용해서 공백으로 숫자를 이어 붙이고, `"\n"`으로 줄바꿈을 줬음

 

2차 풀이

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

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		StringTokenizer st = new StringTokenizer(br.readLine());
		int n = Integer.parseInt(st.nextToken());
		int m = Integer.parseInt(st.nextToken());
		
		// 2개의 행렬 저장할 2개의 2차원 배열
		int[][] arr1 = new int[n][m];
		int[][] arr2 = new int[n][m];
		
		// 마지막 행렬 출력을 위한 StringBuilder
		StringBuilder sb = new StringBuilder();
		
		// 1번 행렬 저장
		for (int i=0; i<n; i++) {
		    st = new StringTokenizer(br.readLine());
		    for (int j=0; j<m; j++) {
		        arr1[i][j] = Integer.parseInt(st.nextToken());
		    }
		}
		
		// 2번 행렬 저장
		for (int i=0; i<n; i++) {
		    st = new StringTokenizer(br.readLine());
		    for (int j=0; j<m; j++) {
		        arr2[i][j] = Integer.parseInt(st.nextToken());
		    }
		}
		
		// 행렬 덧셈 결과를 StringBuilder에 저장
		for (int i=0; i<n; i++) {
		    for (int j=0; j<m; j++) {
		        sb.append(arr1[i][j] + arr2[i][j]).append(" ");
		    }
		    sb.append("\n");    // 줄바꿈
		}
		
		System.out.println(sb);
	}
}

 

1차 풀이에선 복합 대입 연산자 `+=`를 사용해서 arr1[i][j]에 arr2[i][j] 값을 더한 값을 저장하고 출력했음

 

이 문제에선 ` arr1[i][j]`을 갱신해서 다른 곳에 활용하지 않고, 행렬 덧셈 값을 바로 출력하면 되기 때문에

`arr1[i][j] + arr2[i][j]` 결과를 `StringBuilder`에 저장해서 출력하면 됨

 

1차 풀이는 `arr1[i][j]`를 갱신하는 메모리 쓰기가 추가로 있기 때문인지 제거하니까 2차 풀이 실행 시간이 더 빨라짐