백준

백준 10703 유성(JAVA)

sami355 2022. 8. 19. 09:56

문제

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

풀이

풀이의 알고리즘은 다음과 같다.

  1. 입력값을 받아 2차원 배열에 저장 한다.
  2. 유성과 땅사이의 간격중 가장 짧은 길이(min)를 구한다.
  3. min만큼 유성을 아래로 내린다.

생각해야할 점

처음 문제를 볼때 알고리즘을 쉽게 생각했고 구현에 있어서 까다로운 요소랄것도 없어서 구현을 하고 제출을 했지만 틀렸다고 나왔다. 또한 다른 예제 케이스도 찾아보면 돌려보았지만 제대로 나와서 무엇이 문제였는지 오래 생각했는 문제이다. 위의 정답 예시는 인터넷 글을 참조해서 작성한 코드이다.