728x90
반응형
2024.09.14기준 - 실버1
728x90
백준, BEAKJOON, BOJ, JAVA, 자바
풀이
이 문제는 유성이 수직으로 땅에 내려갈 때., 유성이 떨어진 후의 사진을 출력하는 문제입니다.
문제 접근
- 세로를 기준으로 유성과 땅의 거리가 가장 짧은 거리를 구해줍니다.
- 구해준 최솟값을 이용해 유성을 밑으로 이동시킵니다.
- 이동 시킨 사진을 출력해줍니다.
1. 입력받은 유성사진을 2차원 배열에 저장합니다.
// 유성 사진을 저장할 배열
char[][] grid = new char[h][w];
char[] str;
for (int i = 0; i < h; i++) {
str = br.readLine().toCharArray();
for (int j = 0; j < w; j++) {
grid[i][j] = str[j];
}
}
2. 세로를 기준으로 땅과 유성에 사이의 거리 중 최솟값을 구합니다.
// 착륙하기 위해 최대한 적게 내려가야 되는 길이를 저장하는 변수.
int min = Integer.MAX_VALUE;
int meteor, land;
for (int i = 0; i < w; i++) {
meteor = -1;
land = -1;
// 세로 기준으로 땅과 유성의 위치를 구하는 반복문
for (int j = 0; j < h; j++) {
if (grid[j][i] == 'X') {
meteor = j;
} else if (grid[j][i] == '#') {
land = j;
break;
}
}
// 유성이 없다면 다음으로
if (meteor == -1) {
continue;
}
// 땅이 없다면 최대 길이로
if (land == -1) {
land = h - 1;
}
// 가장 적은 길이를 구해준다.
min = Math.min(min, land - meteor - 1);
}
3. 입력받은 사진에서 유성을 최솟값만큼 이동시킵니다.
// 내려갈 수 있는 만큼 유성이 내려가는 반복문.
for (int i = h - 1; i >= 0; i--) {
for (int j = 0; j < w; j++) {
if (grid[i][j] == 'X') {
grid[i + min][j] = 'X';
grid[i][j] = '.';
}
}
}
4. 이동시킨 사진을 출력해줍니다.
// 유성이 내려간 상태를 출력하는 반복문.
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
sb.append(grid[i][j]);
}
sb.append("\n");
}
코드
package Main;
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
StringTokenizer st = new StringTokenizer(br.readLine());
int h = Integer.parseInt(st.nextToken()); // 세로
int w = Integer.parseInt(st.nextToken()); // 가로
// 유성 사진을 저장할 배열
char[][] grid = new char[h][w];
char[] str;
for (int i = 0; i < h; i++) {
str = br.readLine().toCharArray();
for (int j = 0; j < w; j++) {
grid[i][j] = str[j];
}
}
// 착륙하기 위해 최대한 적게 내려가야 되는 길이를 저장하는 변수.
int min = Integer.MAX_VALUE;
int meteor, land;
for (int i = 0; i < w; i++) {
meteor = -1;
land = -1;
// 세로 기준으로 땅과 유성의 위치를 구하는 반복문
for (int j = 0; j < h; j++) {
if (grid[j][i] == 'X') {
meteor = j;
} else if (grid[j][i] == '#') {
land = j;
break;
}
}
// 유성이 없다면 다음으로
if (meteor == -1) {
continue;
}
// 땅이 없다면 최대 길이로
if (land == -1) {
land = h - 1;
}
// 가장 적은 길이를 구해준다.
min = Math.min(min, land - meteor - 1);
}
// 내려갈 수 있는 만큼 유성이 내려가는 반복문.
for (int i = h - 1; i >= 0; i--) {
for (int j = 0; j < w; j++) {
if (grid[i][j] == 'X') {
grid[i + min][j] = 'X';
grid[i][j] = '.';
}
}
}
// 유성이 내려간 상태를 출력하는 반복문.
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
sb.append(grid[i][j]);
}
sb.append("\n");
}
bw.write(sb.toString());
bw.flush();
bw.close();
br.close();
}
}
728x90
반응형
'코딩테스트 일기 (BAEKJOON)' 카테고리의 다른 글
BEAKJOON / 백준 - JAVA 2811번 상범이의 우울 (1) | 2024.09.16 |
---|---|
BEAKJOON / 백준 - JAVA 17070번 파이프 옮기기 1 (0) | 2024.09.15 |
BEAKJOON / 백준 - JAVA 25594번 HG 음성기호 (9) | 2024.09.13 |
BEAKJOON / 백준 - JAVA 1913번 달팽이 (0) | 2024.09.12 |
BEAKJOON / 백준 - JAVA 27952번 보디빌딩 (0) | 2024.09.11 |