개발자 Saaad
[JAVA] 백준 7단계 (2차원 배열) 문제 풀이 본문
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 을 증가시키고 그 값을 출력하였다.
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[JAVA] 백준 6단계 (심화 1) 5~8 문제풀이 (1) | 2025.01.23 |
---|---|
[JAVA] 백준 6단계 (심화 1) 문제 풀이 (4번까지) (1) | 2025.01.22 |
[JAVA] 백준 5단계 (문자열) 문제 풀이 (0) | 2025.01.21 |
[JAVA] 백준 4단계 (1차원 배열) 문제 풀이 (1) | 2025.01.20 |
[JAVA] 백준 3단계(반복문) 문제 풀이 (0) | 2025.01.15 |