본문 바로가기
IT/알고리즘(Algorithm)

[JAVA]백준 2738번 문제 풀이

by 공부하는개미 2022. 11. 26.

# 문제 출제 사이트

https://www.acmicpc.net/problem/2738

 

2738번: 행렬 덧셈

첫째 줄에 행렬의 크기 N 과 M이 주어진다. 둘째 줄부터 N개의 줄에 행렬 A의 원소 M개가 차례대로 주어진다. 이어서 N개의 줄에 행렬 B의 원소 M개가 차례대로 주어진다. N과 M은 100보다 작거나 같

www.acmicpc.net

 

# 문제

N*M크기의 두 행렬 A와 B가 주어졌을 때, 두 행렬을 더하는 프로그램을 작성하시오.

 

# 입력

첫째 줄에 행렬의 크기 N 과 M이 주어진다.

둘째 줄부터 N개의 줄에 행렬 A의 원소 M개가 차례대로 주어진다.

이어서 N개의 줄에 행렬 B의 원소 M개가 차례대로 주어진다.

N과 M은 100보다 작거나 같고, 행렬의 원소는 절댓값이 100보다 작거나 같은 정수이다.

 

# 출력

첫째 줄부터 N개의 줄에 행렬 A와 B를 더한 행렬을 출력한다.

행렬의 각 원소는 공백으로 구분한다.

 

 

# 제출한 소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

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[][] numArr = new int[n][m];

        for ( int i = 0; i < 2; i++ ) {		// 2개의 행열을 입력 받는다.
            for ( int j = 0; j < n; j++ ) {	// n 개의 행을 입력 읽는다.
                st = new StringTokenizer(br.readLine());
                for ( int k = 0; k < m; k++ ) {	// n번째 줄의 m번째 열
                    if ( i == 1 ) {				// B 번째 행열을 입력 받으면 기존 A 행열에 더한다.
                        numArr[j][k] = numArr[j][k] + Integer.parseInt(st.nextToken());
                    } else {					// A 번째 행열을 입력 받는다.
                        numArr[j][k] = Integer.parseInt(st.nextToken());
                    }
                }
            }
        }

        for ( int i = 0; i < n; i++ ) {
            for ( int j = 0; j < m; j++ ) {
                System.out.print(numArr[i][j] + " ");
            }
            System.out.println();
        }
    }
}
  • 의식의 흐름대로 작성한 코드, 너무 투박하고 코드가 복잡해 보인다.
  • 2차원 배열 정수를 입력 받기 위해 numArr 이라는 2차원 배열을 선언했다.
  • 3중 for문을 사용해서 A 와 B의 행열을 입력 받고 더하는 로직을 구현했다.
  • 2중 for문을 사용해서 덧셈이 완료된 행열을 출력했다.

 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

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[][] numArr = new int[n][m];

        for ( int i = 0; i < 2; i++ ) {
            for ( int j = 0; j < n; j++ ) {
                st = new StringTokenizer(br.readLine());
                for ( int k = 0; k < m; k++ ) {
                        numArr[j][k] += Integer.parseInt(st.nextToken());
                }
            }
        }

        for ( int i = 0; i < n; i++ ) {
            for ( int j = 0; j < m; j++ ) {
                System.out.print(numArr[i][j] + " ");
            }
            System.out.println();
        }
    }
}
  • 3중 for문 안에 있던 if문 제거

 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

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[][] numArr = new int[n][m];

        for ( int i = 0; i < 2; i++ ) {
            for ( int j = 0; j < n; j++ ) {
                st = new StringTokenizer(br.readLine());
                for ( int k = 0; k < m; k++ ) {
                        numArr[j][k] += Integer.parseInt(st.nextToken());
                }
            }
        }

        StringBuilder sb = new StringBuilder();
        for ( int i = 0; i < n; i++ ) {
            for ( int j = 0; j < m; j++ ) {
                sb.append(numArr[i][j] + " ");
            }
            sb.append("\n");
        }
        System.out.println(sb.toString());
    }
}
  • StringBuilder를 사용해서 출력을 해봤다.
반응형