코딩테스트/백준

[백준]10709번 기상캐스터 - Java

GAEBAL 2022. 2. 28. 23:52
728x90

문제

https://www.acmicpc.net/problem/10709

 

10709번: 기상캐스터

출력은 H 행으로, 각 행에는 공백으로 구분된 W 개의 정수를 출력한다. 출력의 i 번째 행 j 번째 정수 (1 ≦ i ≦ H, 1 ≦ j ≦ W) 는, 지금부터 몇 분후에 처음으로 구역 (i, j) 에 구름이 뜨는지를 표시

www.acmicpc.net

 

풀이

많은 이차원배열 탐색 문제 중에서도 쉬운 편이 아닐까 싶음

사방탐색, 팔방탐색 뭐시기뭐시기 많이 있지만 이건 오른쪽 한 방향으로만 탐색하면 되기 때문에 쉽게 풀린 것 같다

 

출력을 int[][] 형태로 해야하기 때문에 문제를 입력받는 char[][] map 배열과 정답을 저장하여 출력할 int[][] answerMap 배열을 만들어서 사용했음

구름 c를 만나면 오른쪽으로만 이동하여 다른 구름 c를 만나거나 범위를 넘어가기 전까지 탐색해야 했기 때문에 while(true){ }를 사용했음

한 방향으로만 탐색하면 됐기 때문에 따로 방향 벡터를 static으로 선언하거나 하진 않고 그냥 x좌표값(column)에 1씩 더해주는 방식으로 칸을 이동하였음

 

나머지는 주석으로

 

코드

// 10709번 기상캐스터
// https://www.acmicpc.net/problem/10709

package BAEKJOON;

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

public class Num10709_기상캐스터 {
    static char[][] map;
    static int[][] answerMap;
    static int H, W;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        H = Integer.parseInt(st.nextToken());
        W = Integer.parseInt(st.nextToken());

        map = new char[H][W];
        answerMap = new int[H][W];

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

        int count = 0;

        for (int i = 0; i < H; i++) {
            for (int j = 0; j < W; j++) {
                if (map[i][j] == 'c') { // 구름이면
                    while (true) {
                        map[i][j] = 'f'; // 구름말고 상관없는 문자 아무거나로 만들고
                        answerMap[i][j] = count; // 정답배열에 count를 넣어줌
                        count++;

                        int nc = j + 1; // 현재칸의 오른쪽칸으로 가기 위함

                        // 다음 칸이 범위에서 벗어나거나 구름이면 count 초기화 후 break
                        if (nc >= W || map[i][nc] == 'c') {
                            count = 0;
                            break;
                        } else { // 다음 칸이 범위에 있고 구름이 아니면
                            map[i][nc] = 'f'; // 상관없는 문자 아무거나로 만들고
                            answerMap[i][nc] = count; // 정답 배열에 증가된 count 넣어주기
                            j = nc; // 현재칸을 다음칸으로 이동
                        }
                    }
                }
            }
        }

        // 마지막에 . 남은거는 -1로
        for (int i = 0; i < H; i++) {
            for (int j = 0; j < W; j++) {
                if (map[i][j] == '.') {
                    answerMap[i][j] = -1;
                }
            }
        }

//        // 테스트
//        System.out.println();
//        for (int a = 0; a < H; a++) {
//            System.out.println(Arrays.toString(answerMap[a]));
//        }

        // 출력
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < H; i++) {
            for (int j = 0; j < W; j++) {
                sb.append(answerMap[i][j]).append(" ");
            }
            sb.setLength(sb.length() - 1);
            sb.append("\n");
        }
        sb.setLength(sb.length() - 1);
        System.out.println(sb);
    }
}
728x90