개발자 Saaad

[JAVA] 백준 7단계 (2차원 배열) 문제 풀이 본문

알고리즘 문제풀이/백준

[JAVA] 백준 7단계 (2차원 배열) 문제 풀이

Saaad 2025. 1. 24. 16:53

1. 2738번 행렬 덧셈

  • 행렬 두 개의 크기를 지정해 준 후 서로 행렬 덧셈을 하는 문제이다.

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));
        StringBuilder sb = new StringBuilder();

        // 행렬 크기 입력 (한 줄 입력)
        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());

        // 행렬 A 입력
        int[][] A = 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());
            }
        }

        // 행렬 B 입력
        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++) {
                B[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        // 행렬 덧셈 수행
        int[][] sum = new int[N][M];
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                sum[i][j] = A[i][j] + B[i][j];
            }
        }

        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                sb.append(sum[i][j]).append(" ");
            }
            sb.append("\n");
        }

        System.out.print(sb.toString());
    }
}
  • 행렬 크기를 입력받고 두번의 for문을 통해 각 A, B행렬에 값을 입력한다.
  • 각 행렬을 같은 인덱스 i, j 에서 값을 더한 sum행렬에 저장한다.

2. 2566번 최댓값 

  • 행렬에 저장되어있는 값 중에 최댓값을 찾고, 그 최댓값이 있는 위치를 출력하는 문제이다.

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

        // 9 x 9 행렬 생성
        int[][] A = new int[9][9];

        // 행렬 입력
        for (int i = 0; i < 9; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            for (int j = 0; j < 9; j++) {
                A[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        int max = -1;
        int row = 0, col = 0;

        // 행렬을 순회하며 최댓값 탐색
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                if (A[i][j] > max) {
                    max = A[i][j];
                    row = i+1; col = j+1;
                }
            }
        }
        System.out.println(max);
        System.out.println(row + " " + col);;
    }
}
  • 행렬을 for문을 통해 순회하며 max값과 행과 열 값을 계속 업데이트해주면 된다.

 


3. 10798번 세로읽기

  • 가로로 입력한 것을 세로로 읽으면 되는 문제이다. 자바에서 배열의 값이 입력이 되지 않은 곳은 '\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));

        char[][] arr = new char[5][15];
        
        for(int i = 0; i < 5; i++) {
            String str = br.readLine();

            for(int j = 0; j < 15; j++) {
                // 입력 문자열 길이를 초과하면 continue
                if (j >= str.length()) continue;

                char c = str.charAt(j);

                arr[i][j] = c;
            }
        }

        for (int col = 0; col < 15; col++) {
            for (int row = 0; row < 5; row++) {
                if (arr[row][col] == '\0') continue;  // (✔) 초기값이 '\0'이면 출력하지 않음
                System.out.print(arr[row][col]);
            }
        }

    }
}
  • 배열을 [5][15] 크기로 만들고 for문을 돌며 순서대로 문자를 하나씩 꺼내며 저장한다.
  • 이 때, 입력한 문자열의 길이를 초과하게 될 때 for문에 들어가게되면 오류가 발생한다. 따라서 문자열의 길이를 넘었을 때 continue를 이용해 처리해준다.
  • 세로로 읽어 출력하기 위해 각 열의 값들을 순서대로 출력하기 위해 2중 for문을 사용하였다.
  • 만약에 배열 안의 값이 '\0' 이라면 값이 할당이 되지 않은 것이기 때문에 continue를 통해 뛰어넘었다.

 


다른 풀이 

  • 앞서 문제에서는 입력 문자열의 길이를 초과하면 continue를 이용해서 뛰어넘도록 했는데 이 방법은 굳이 할 필요 없는 for문의 동작을 초래한다.
  • 입력한 문자열의 길이 만큼만 for문을 동작하게 하여 불필요한 동작을 최소화한다.
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());

    }
}
  • 스터디 팀원의 코드를 가져왔다 (감사합니다)
  • for문을 입력받은 문자열의 길이만큼만 작동하게 하여 불필요한 동작을 없앴다.
  • 내 코드와 다르게 문자열이 존재하는 곳에 대해서는 line.charAt(j)를 통해 배열에 값을 입력해주었고,
    빈 부분에 대해서 공백 문자를 저장하여 처리해주었다. <- 이게 다른 점
  • 그런 후 나중에 출력할 때 if문을 통해 공백인지 아닌지를 판별하여 StringBuilder 객체에 append() 를 이용해 추가해주었다.

 

 

shout out,  출처: https://uplifted.tistory.com/244 

 

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

안녕하세요~오늘은 7단계 2차원 배열을 푸는 날입니다!✏️ 문제 번호 : 2738행렬 덧셈 문제 살펴보기N*M 크기의 두 행렬 A와 B첫째 줄 N(행)과 M(열)둘째 줄부터 N개의 줄에 행렬 A의 원소 M개이어서

uplifted.tistory.com

 


4. 2563번 색종이

  • 100 x 100 도화지에서 검은색 색종이가 차지하고 있는 넓이를 구하는 문제이다. 
  • 색종이는 포개져있을 수 있다.

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

        // 색종이의 개수
        int N = Integer.parseInt(br.readLine());

        int [][] sketchBook = new int[100][100];

        for (int i = 0; i < N; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int x = Integer.parseInt(st.nextToken());
            int y = Integer.parseInt(st.nextToken());

            for(int j = x; j < x + 10; j++ ) {
                for(int k = y; k < y + 10; k++ ) {
                    sketchBook[j][k] = 1;
                }
            }
        }

        int sum = 0;
        for (int i = 0; i < 100; i++) {
            for (int j = 0; j < 100; j++) {
                if(sketchBook[i][j] == 1) {
                    sum++;
                }
            }
        }
        System.out.println(sum);
    }
}
  • sketchBook 이라는 2차원 배열을 100 x 100 크기로 초기화한다.
  • for문을 돌며 색종이가 왼쪽으로부터 떨어져있는 거리(x), 색종이가 아래로부터 떨어져있는 거리(y) 를 입력 받는다.
  • 그 x, y 값에서 + 10 까지의 영역을 1을 저장하여 색종이가 올려져있음을 나타냈다.
  • 마지막으로, sketchBook 2차원배열을 전부 순회하며 값이 1인 곳이 나올 때 마다 sum 을 증가시키고 그 값을 출력하였다.