[백준] 10709 기상 캐스터 (JAVA)

2025. 7. 9. 16:09·코딩 테스트

문제 링크:

10709번: 기상캐스터

 

문제:

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을 출력한다.

 

 

힌트:

문제이해:

 

하늘은 여러 칸으로 나뉘어 있고, 각 칸엔 구름이 있거나 없다. 구름이 있는 칸은 c, 없는 칸은 .로 표시된다. 구름은 1분에 오른쪽으로 한 칸씩 이동한다. 이때, 각 칸에 구름이 몇 분 뒤에 오는지를 숫자로 표시해야 한다. 구름이 바로 위에 있으면 0, 왼쪽에서 구름이 오면 몇 분 걸리는지를 적는다. 앞으로도 구름이 오지 않는 칸은 -1로 표시한다.

 

예를 들어 3행 4열짜리 하늘이 있고, 입력이 아래와 같다고 하자.

c..c
..c.
....

 

이걸 한 칸씩 왼쪽에서 오른쪽으로 보면서, 구름이 처음 나온 칸엔 0을 적고, 그 다음 칸엔 1, 그다음엔 2처럼 하나씩 더해가면 된다. 구름이 보이지 않는 상태에서 시작하는 칸은 -1로 시작하고, 이전에 구름이 있었다면 거리만큼 숫자를 적는다. 구름이 다시 나오면 또 0부터 시작한다.

 

결과는 이렇게 된다.

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

 

구름이 있으면 0, 그 오른쪽엔 1, 2, 구름이 또 나타나면 다시 0. 구름이 아예 안 오는 줄은 전부 -1.

이건 그냥 각 줄마다 왼쪽부터 보면서 구름이 나왔는지 기억하고, 거리를 세면서 숫자만 적으면 된다. 그렇게 한 줄씩 차례대로 하면 된다. 복잡하게 생각하지 말고, 단순히 한 칸씩 보면서 구름이 있으면 0, 없으면 그전에 구름이 있었는지 확인하고 거리 세면 되는 문제다.

 

구현 방식:

입력으로 하늘의 세로와 가로 크기를 받고, 그만큼의 칸에 구름이 있는지 없는지를 저장한다. 하늘의 상태는 줄마다 문자열로 들어오고, 각 칸은 문자 하나로 표현된다. 이제 해야 할 일은 각 칸마다 구름이 몇 분 뒤에 도착하는지를 계산하는 것이다. 왼쪽에서 오른쪽으로 한 줄씩 보면서, 구름이 아직 나타나지 않았으면 -1을 적고, 구름이 보이면 0을 적고, 이후 칸부터는 1씩 더한 값을 적는다. 다시 구름이 보이면 0으로 초기화하고 그다음 칸부터 또 1씩 더해가면 된다. 구름이 전혀 없는 줄은 전부 -1이 된다. 출력할 때는 각 줄의 숫자 사이에만 공백을 넣고 줄 끝에는 공백이 없도록 처리하면 된다. 전체 흐름은 입력 받고, 줄마다 순서대로 처리하고, 결과를 출력하는 구조로 이루어지면 된다.

 

정답 코드:

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

public class Main {

    public static void ResultPrint(char[][] matrix, int H, int W) {
        for (int i = 0; i < H; i++) {
            for (int j = 0; j < W; j++) {

                //해당 자리가 구름인 경우
                if (matrix[i][j] == 'c') {
                    System.out.print(0);
                }

                //구름이 아닌 경우
                else {
                    int count = -1;
                    //해당 자리 이전을 모두 검사하면서 구름이 나올때 까지 검사
                    for (int z = j - 1; z >= 0; z--) {
                        //구름이 등장했다면 해당 간격 출력
                        if (matrix[i][z] == 'c') {
                            count = j - z;
                            break;
                        }
                    }
                    System.out.print(count);
                }

                // 마지막 열이 아니라면 공백 추가
                if (j != W - 1) {
                    System.out.print(" ");
                }
            }
            System.out.println(); // 줄 바꿈
        }
    }


    public static void main(String[] args) throws IOException {
        int H,W;
        char[][]matrix;

        BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st= new StringTokenizer(br.readLine());
        //H와 W 입력
        H= Integer.parseInt(st.nextToken());
        W= Integer.parseInt(st.nextToken());

        matrix= new char[H][W];


        //maxtrix 입력
        for (int i = 0; i < H; i++) {
            String line = br.readLine();
            for (int j = 0; j < W; j++) {
                matrix[i][j] = line.charAt(j);
            }
        }

        ResultPrint(matrix,H,W);

    }
}

 

 

마무리하며:

처음 풀 때는 각 칸마다 구름이 언제 오는지만 잘 계산하면 될 줄 알았는데, 출력할 때 숫자 뒤에 공백을 무조건 붙였다가 오답 처리가 났다. 알고 보니 문제에서는 줄 끝에 공백이 들어가면 안 되는 형식이었다. 로직은 맞았는데 출력 형식 하나 때문에 틀린 거라 아쉬웠다. 이 문제를 풀 때는 출력 마지막에 공백이 들어가지 않도록 조심해야 하니까, 같은 실수 하지 않도록 꼭 참고하면 좋겠다.

'코딩 테스트' 카테고리의 다른 글

[백준] 4949 균형잡힌 세상 (JAVA)  (1) 2025.07.11
[백준] 2852 NBA 농구 (JAVA)  (7) 2025.07.10
[백준] 2870 수학숙제 (JAVA)  (0) 2025.07.08
[백준] 4659 비밀번호 발음하기 (JAVA)  (1) 2025.07.06
[백준] 2910 빈도 정렬 (JAVA)  (1) 2025.07.04
'코딩 테스트' 카테고리의 다른 글
  • [백준] 4949 균형잡힌 세상 (JAVA)
  • [백준] 2852 NBA 농구 (JAVA)
  • [백준] 2870 수학숙제 (JAVA)
  • [백준] 4659 비밀번호 발음하기 (JAVA)
0kingki_
0kingki_
자바 + 스프링 웹 개발
  • 0kingki_
    0kingki_
    0kingki_
  • 전체
    오늘
    어제
    • 분류 전체보기 (134)
      • 코딩 테스트 (54)
      • 자바 (21)
      • 스프링 (27)
      • 타임리프 (16)
      • 스프링 데이터 JPA (8)
      • 최적화 (2)
      • QueryDSL (4)
      • AWS (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    JPA
    QueryDSL
    컬렉션
    쿼리
    예외처리
    백준
    LocalDateTime
    객체지향
    mvc
    thymeleaf
    불변객체
    재귀
    예외 처리
    SpringDataJpa
    spring
    dfs
    쿼리dsl
    Java
    스프링 데이터 JPA
    최적화
    타임리프
    스프링
    코딩 테스트
    SOLID
    스프링 컨테이너
    코딩테스트
    다형성
    자바
    fetch join
    BFS
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
0kingki_
[백준] 10709 기상 캐스터 (JAVA)
상단으로

티스토리툴바