[백준] 10709 기상캐스터 JAVA

·2024년 3월 11일

1일1백준 -Java-

목록 보기
36/60

문제

JOI시는 남북방향이 H 킬로미터, 동서방향이 W 킬로미터인 직사각형 모양이다. JOI시는 가로와 세로의 길이가 1킬로미터인 H × W 개의 작은 구역들로 나뉘어 있다. 북쪽으로부터 i 번째, 서쪽으로부터 j 번째에 있는 구역을 (i, j) 로 표시한다.

각 구역의 하늘에는 구름이 있을 수도, 없을 수도 있다. 모든 구름은 1분이 지날 때마다 1킬로미터씩 동쪽으로 이동한다. 오늘은 날씨가 정말 좋기 때문에 JOI시의 외부에서 구름이 이동해 오는 경우는 없다.

지금 각 구역의 하늘에 구름이 있는지 없는지를 알고 있다. 기상청에서 일하고 있는 여러분은 각 구역에 대해서 지금부터 몇 분뒤 처음으로 하늘에 구름이 오는지를 예측하는 일을 맡았다.

각 구역에 대해서 지금부터 몇 분뒤 처음으로 하늘에 구름이 오는지를 구하여라.

입력

입력은 1 + H 행으로 주어진다.

첫 번째 행에는 정수 H, W (1 ≦ H ≦ 100, 1 ≦ W ≦ 100) 가 공백을 사이에 주고 주어진다. 이것은 JOI시가 H × W 개의 작은 구역으로 나뉘어 있다는 것을 의미한다.

이어진 H 개의 행의 i번째 행 (1 ≦ i ≦ H) 에는 W문자의 문자열이 주어진다. W 개의 문자 중 j번째 문자 (1 ≦ j ≦ W) 는, 구역 (i, j) 에 지금 구름이 떠 있는지 아닌지를 나타낸다. 구름이 있는 경우에는 영어 소문자 'c' 가, 구름이 없는 경우에는 문자 '.' 가 주어진다.

출력

출력은 H 행으로, 각 행에는 공백으로 구분된 W 개의 정수를 출력한다. 출력의 i 번째 행 j 번째 정수 (1 ≦ i ≦ H, 1 ≦ j ≦ W) 는, 지금부터 몇 분후에 처음으로 구역 (i, j) 에 구름이 뜨는지를 표시한다. 단, 처음부터 구역 (i, j) 에 구름이 떠 있었던 경우에는 0을, 몇 분이 지나도 구름이 뜨지 않을 경우에는 -1을 출력한다.

예제 입력

3 4
c..c
..c.
....

예제 출력

0 1 2 0
-1 -1 0 1
-1 -1 -1 -1

내가 했던 풀이 방법

  1. 현재 구름의 위치를 입력받을 cloud 배열과 몇 분 후에 구름이 뜨는지를 표시하는 region 배열을 만든다.
  2. region 배열은 전부 -1로 초기화해준다. (처리하지 않는 값은 -1로 출력되도록 함)
  3. 현재 구름의 위치를 입력받는 동안 사용할 rise와 minute을 초기화해준다. (rise는 구름이 곧 뜨는지를 의미한다. (즉, 앞으로 구름이 뜰 예정인지를 의미) minute는 앞으로 몇 분 후에 뜨는지를 의미한다.)
  4. 현재 위치에서 구름이 떠있다면, region 배열의 현재 위치를 0으로 바꿔주고, rise와 minute 값을 설정해준다. (minute는 1분으로 해준다. (다음 지역에서 바로 출력할 수 있도록))
  5. 현재 위치에 구름이 떠있지 않고, rise가 true일 때 (현재 구름은 안 떠있지만, 곧 구름이 올 때) region 배열의 현재 위치에 minute을 넣어주고 minute을 1 증가시킨다.
  6. 입력을 모두 받은 후 region을 출력해준다.

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
        public static void main(String[] args) throws IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] WH = br.readLine().split(" ");
        int H = Integer.parseInt(WH[0]);
        int W = Integer.parseInt(WH[1]);

        char [][] cloud = new char[H][W];
        int [][] region = new int[H][W];
        for (int i=0; i<H; i++) {
            Arrays.fill(region[i], -1);
        }

        String input;
        boolean rise = false;
        int minute = 0;
        for(int i=0; i<H; i++) {
            input = br.readLine();
            minute = 0;
            rise = false;
            for(int j=0; j<W; j++) {
                cloud[i][j] = input.charAt(j);
                if(cloud[i][j]=='c') {
                    region[i][j] = 0;
                    rise = true;
                    minute = 1;
                } else {
                    if(rise) {
                        region[i][j] = minute;
                        minute++;
                    }
                }
            }
        }

        for(int i=0; i<H; i++) {
            for(int j=0; j<W; j++) {
                System.out.print(region[i][j] + " ");
            }
            System.out.println();
        }
    }   
}

회고

정답 비율이 높은 문제다 보니 난이도가 좀 쉬운 편이었던 것 같다. 입력을 받은 후, 계산하는 걸 추구하는데 (코드가 난해해질 수 있으니까) 2차원 배열이다보니 아무래도 입력을 받으면서 해야 2중 for문의 잦은 사용이 줄어들 것 같아서 입력과 동시에 계산을 해봤다. 코드 자체가 짧고 구현 방법도 간단해서 오히려 이 방법이 좋았던 것 같다. 앞으로는 입력받으면서 계산하는 것도 긍정적으로 생각해봐야겠구만.

profile
Frontend🍓

0개의 댓글