본문 바로가기
알고리즘/백준

[단계별로 풀어보기-Java] 7단계 2차원 배열

by 꾸주니=^= 2025. 1. 24.

백준 사이트 로고

 

안녕하세요~


오늘은 7단계 2차원 배열을 푸는 날입니다!


✏️ 문제 번호 : 2738
행렬 덧셈

 

문제 살펴보기

N*M 크기두 행렬 A와 B

첫째 줄 N(행)M(열)
둘째 줄부터 N개의 줄에 행렬 A의 원소 M개
이어서 N개의 줄에 행렬 B의 원소 M개

각 행렬 A와 행렬 B의 N번째 줄을 더한 행렬을 출력하기

행렬 A    +     행렬 B        -->     출력
1 1 1             3 3 3                   4 4 4
2 2 2           4 4 4                   6 6 6
0 1 0           5 5 100                5 6 100
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        String[] input = br.readLine().split(" ");

        int N = Integer.parseInt(input[0]);
        int M = Integer.parseInt(input[1]);

        int[][] matrixA = new int[N][M];
        int[][] matrixB = new int[N][M];

        for (int i = 0; i < N; i++) {
            String[] line = br.readLine().split(" ");
            for (int j = 0; j < M; j++) {
                matrixA[i][j] = Integer.parseInt(line[j]);
            }

        }
        for (int i = 0; i < N; i++) {
            String[] line = br.readLine().split(" ");
            for (int j = 0; j < M; j++) {
                matrixB[i][j] = Integer.parseInt(line[j]);
            }
        }

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                sb.append(matrixA[i][j] + matrixB[i][j]).append(" ");
            }
            sb.append("\n");
        }
        System.out.print(sb);
    }
}

 

풀이 과정

N(행), M(열)을 입력 받고 행렬 A,B 2차원 배열을 만듭니다.

그 후, 각 행렬마다 N,M을 입력 받습니다.

StringBuilder를 사용해서 각 행의 값을 공백으로 구분한 후
각 행을 더했습니다.

 


✏️ 문제 번호 : 2566
최댓값

 

문제 살펴보기

9*9 격자판, 81개의 자연수

최댓값몇 열, 몇 행에 위치하는지 출력하기

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

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

        int[][] board = new int[9][9];

        int max = Integer.MIN_VALUE;
        int maxRow = 0;
        int maxCol = 0;
        
        for(int i=0;i<9;i++){
            String[] input = br.readLine().split(" ");
            for(int j=0;j<9;j++){
                board[i][j]=Integer.parseInt(input[j]);

                if(board[i][j]>max){
                    max = board[i][j];
                    maxRow = i + 1;
                    maxCol = j + 1;
                }
            }

        }
        System.out.println(max);
        System.out.println(maxRow + " " + maxCol);

    }
}

 

풀이 과정

격자판 board 행,열을 9*9로 만듭니다.

최대값을 찾기 위해, max변수와
최대값을 저장할 행,열 변수도 만듭니다.

for문을 통해 자연수를 입력 받고, 
board[i][j]가 max보다 클 경우, max에 값을 저장하고,
행,열 번호도 저장합니다. 

이 때, 행 열 번호는 1부터 시작하므로 1을 더해줍니다.

 


✏️ 문제 번호 : 10798
세로읽기

 

문제 살펴보기

글자, 영어 대소문자, 숫자0~9 입력 받기

총 다섯 줄의 입력 주어짐.
각 줄에는 최소 1개 ~ 최대 15개의 글자들을 빈칸 없이 연속으로 주어짐
각 줄의 시작과 마지막에 빈칸은 없다.

출력할 때 세로로 읽은 순서대로 글자들을 출력한다.
이 때, 글자들을 공백 없이 연속해서 출력한다.

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

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

        char[][] board = new char[5][15];
        for (int i = 0; i < 5; i++) {
            String line = br.readLine();
            for (int j = 0; j < line.length(); j++) {
                board[i][j] = line.charAt(j);
            }
            // 빈 부분은 공백으로
            for (int j = line.length(); j < 15; j++) {
                board[i][j] = ' ';
            }
        }

        StringBuilder result = new StringBuilder();
        for (int col = 0; col < 15; col++) {
            for (int row = 0; row < 5; row++) {
                if (board[row][col] != ' ') {
                    result.append(board[row][col]);
                }
            }
        }

        System.out.println(result.toString());

    }
}

 

풀이 과정

5개의 열, 최대 15개의 행을 입력 받는 2차원 배열을 만듭니다.

행을 입력 받을 때, 문자열 길이를 확인해서
입력 받지 못한 부분은 공백으로 처리합니다.

세로로 읽기 위해서 각 열을 기준으로 행을 순서대로 읽습니다.

만약 공백이 있다면 추가하지 않고,
공백 없는 문자들을 result에 추가합니다.

 


✏️ 문제 번호 : 2563
색종이

 

문제 살펴보기

가로, 세로 크기가 각각 100인 정사각형 모양의 흰색 도화지
도화지 위에 가로, 세로 크기가 각각 10인 정사각형 모양 검은색 색종이 붙임

검은색 색종이를 여러 장 붙인 후,
색종이가 붙은 검은 영역의 넓이를 구하자!

 

입력 값의 분석은 다음과 같습니다.

//첫째 줄에 색종이의 수
3

// 둘째 줄부터 한 줄에 하나씩 색종이를 붙인 위치 주어짐
3 7
15 7
5 2

/*
3, 15, 5 : 색종이의 왼쪽 변과 도화지의 왼쪽 변 사이의 거리 = x축
7, 7, 2 : 색종이의 아래쪽 변과 도화지의 아래쪽 변 사이의 거리 = y축
*/

 

출력 값은 색종이가 붙은 검은 영역의 넓이를 출력해야합니다.

붙인 검정 색종이는 가로 세로 크기가 10입니다.

색종이가 붙은 검은 영역의 넓이를 출력해야하므로,
각 색종이의 해당하는 면적을 더해야합니다.

 이 때, 겹치는 색종이의 배열 칸도 있을 것입니다.

검정 색종이 영역은 1, 아닌 부분은 0으로 생각해서 계산을 합니다.

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

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

        int[][] canvas = new int[100][100];
        int N = Integer.parseInt(br.readLine());

        for (int i = 0; i < N; i++) {
            String[] input = br.readLine().split(" ");
            int x = Integer.parseInt(input[0]);
            int y = Integer.parseInt(input[1]);

            for (int j = x; j < x + 10; j++) {
                for (int k = y; k < y + 10; k++) {
                    canvas[j][k] = 1;
                }
            }
        }
        
        int black = 0;
        for (int i = 0; i < 100; i++) {
            for (int j = 0; j < 100; j++) {
                if (canvas[i][j] == 1) {
                    black++;
                }
            }
        }

        System.out.println(black);
    }
}

 

풀이 과정

흰색도화지(canvas) 넓이는 가로, 세로 100이므로
0으로 초기화된 canvas[100][100] 2차원 배열을 만들어 줍니다.

검은색종이 넓이는 가로, 세로 10이므로 
for문을 x,y를 10 더한 만큼 순회합니다.

canvas에 색칠됐기 때문에 값을 1로 바꿔줍니다.

그 후, canvas가 1인 값의 개수를 세어 결과를 출력합니다.


 

이처럼 오늘은 백준 7단계를 풀어봤습니다 ~

저는 다음 8단계 문제로 돌아오겠습니다 😉

 

오코완
(오늘도 코테 공부 완료)

인스타그램 : pettydust