문제
https://www.acmicpc.net/problem/10703
10703번: 유성
작고 특이한 모양의 유성 사진이 인터넷에 올라왔다. 사진에는 매우 높은 곳에서 떨어지고 있는 유성이 허공에 찍혀 있었다. 유성이 떨어지고 난 뒤의 사진도 있었지만 안타깝게도 소실돼버려
www.acmicpc.net
코드
package com.company;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
class Main {
static int R, S;
static char pic[][];
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 min = Integer.MAX_VALUE;
R = Integer.parseInt(st.nextToken());
S = Integer.parseInt(st.nextToken());
pic = new char[R][S];
//입력 받는 칸
for (int i = 0; i < R; i++) {
String temp = br.readLine();
for (int j = 0; j < S; j++) {
pic[i][j] = temp.charAt(j);
}
}
//운석과 땅사이에 존재하는 길이 구하기
for (int j = 0; j < S; j++) {
int cnt = 0;
for (int i = 0; i < R; i++) {
if (i + 1 < S && pic[i][j] == 'X' && pic[i + 1][j] == '.') {
for (int k = i + 1; k < R - 1; k++) {
if (pic[k][j] == '#')
break;
if (pic[k][j] == 'X') {
cnt = 0;
break;
}
if (pic[k][j] == '.')
cnt++;
}
}
if (cnt > 0 && pic[i][j] == '#') {
min = Math.min(cnt, min);
cnt = 0;
}
}
}
for (int j = 0; j < S; j++) {
for (int i = R - 1; i >= 0; i--) {
if (pic[i][j] == 'X' && pic[i + min][j] == '.') {
char temp = pic[i][j];
pic[i][j] = pic[i + min][j];
pic[i + min][j] = temp;
}
}
}
for (int i = 0; i < R; i++) {
for (int j = 0; j < S; j++) {
sb.append(pic[i][j]);
}
sb.append("\\n");
}
System.out.println(sb.toString());
}
}
풀이
풀이의 알고리즘은 다음과 같다.
- 입력값을 받아 2차원 배열에 저장 한다.
- 유성과 땅사이의 간격중 가장 짧은 길이(min)를 구한다.
- min만큼 유성을 아래로 내린다.
생각해야할 점
처음 문제를 볼때 알고리즘을 쉽게 생각했고 구현에 있어서 까다로운 요소랄것도 없어서 구현을 하고 제출을 했지만 틀렸다고 나왔다. 또한 다른 예제 케이스도 찾아보면 돌려보았지만 제대로 나와서 무엇이 문제였는지 오래 생각했는 문제이다. 위의 정답 예시는 인터넷 글을 참조해서 작성한 코드이다.
'백준' 카테고리의 다른 글
[백준] 1260 DFS와 BFS (0) | 2023.03.08 |
---|---|
백준 17128 소가 정보섬에 올라온 이유(JAVA) (0) | 2022.08.19 |
백준 5766 할아버지는 유명해!(JAVA) (0) | 2022.08.17 |
백준 2729 이진수 덧셈(JAVA) (0) | 2022.08.17 |
백준 18311 왕복 (JAVA) (0) | 2022.08.15 |